华为od机试题
第一题:给定一个队列,但是这个队列比较特殊,可以从头部添加数据,也可以从尾部添加数据,但是只能从头部删除数据。输入一个数字n,会依次添加数字1~n(也就是添加n次),但是是从头部添加还是从尾部添加未知,也会删除n次,要求也必须从按照1~n删除。因为可以从头部添加,也可以从尾部添加,所以顺序不对,题目说可以随时调整顺序,要求删除必须按照1~n删除,求最小的调整顺序次数。
输入:数字n,接下来的2n行是添加和删除语句。
题解:只有79.1%通过率,提示我超时,最后还是没写出100%
import java.util.*;
public class Solution1 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
List<String> list = new ArrayList<>();
while(scanner.hasNextLine()){
list.add(scanner.nextLine());
}
int n = Integer.parseInt(list.get(0));
Deque<Integer> deque = new LinkedList<>();
int start = 1;
int count = 0;//这个是移动次数
for(int j = 1;j<list.size();j++){
String str = list.get(j);
//如果是移除指令
if(str.equals("remove")){
if(!deque.isEmpty()){
if(deque.peekFirst()==start){
//如果队列不为空,且移除来的就是start那么可以移除
deque.removeFirst();
start++;
}else{
//此时就需要移动了
List<Integer> list1 = new ArrayList<>();
while(!deque.isEmpty()){
list1.add(deque.removeFirst());
}
Collections.sort(list1);
for(int temp = 0;temp<list1.size();temp++){
deque.addLast(list1.get(temp));
}
deque.removeFirst();
count++;
}
}
continue;
}
String[] strs = str.split(" ");
//如果是添加指令
if( strs[1].equals("add")){
if(strs[0].equals("head")){
//从头部添加
deque.addFirst(Integer.parseInt(strs[2]));
}else{
//从尾部添加
deque.addLast(Integer.parseInt(strs[2]));
}
}
}
System.out.println(count);
}
}
第二题:
0、1、2代表汽车颜色,汽车每秒只能出现1次,形如[1,2,2,0],给定一个时间,求这个时间内,汽车颜色出现最多的汽车数量。
难倒是不难,但是最后也只有90%通过率。
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
int win = scanner.nextInt();
String[] strs = str.split(" ");
int[] nums = new int[strs.length];
for(int i=0;i<strs.length;i++){
nums[i] = Integer.parseInt(strs[i]);
}
int max = Integer.MIN_VALUE;
for(int i=0;i<=nums.length-win;i++){
Map<Integer,Integer> map = new HashMap<>();
for(int j=i;j<i+win;j++){
if(map.containsKey(nums[j])){
map.put(nums[j],map.get(nums[j])+1);
}else{
map.put(nums[j],1);
}
}
for(int k : map.values()){
max = Math.max(max,k);
}
}
System.out.println(max);
}
}
第三题:数字1、2、3、4、5、6、7、8、9分别关联不同的字母,例如7关联"u","v",8关联"x","w",输入一个字符串例如“78”,
和一个屏蔽字符串“ux”,那么“78”可以组成多个字符串例如:“ux”,“uw”,“vx”,“vw”,过滤这些完全包含屏蔽字符串的每一个字符的字符串,然后输出剩下的字符串。100%通过率。
import java.util.*;
public class Solution2 {
public static Map<Character, List<String>> map = new HashMap<>();
static {
map.put('0',new ArrayList<String>(){{add("a");add("b");add("c");}});
map.put('1',new ArrayList<String>(){{add("d");add("e");add("f");}});
map.put('2',new ArrayList<String>(){{add("g");
add("h");
add("i");}});
map.put('3',new ArrayList<String>(){{add("j");
add("k");
add("l");}});
map.put('4',new ArrayList<String>(){{add("m");
add("n");
add("o");}});
map.put('5',new ArrayList<String>(){{add("p");
add("q");
add("r");}});
map.put('6',new ArrayList<String>(){{add("s");
add("t");}});
map.put('7',new ArrayList<String>(){{add("u");
add("v");}});
map.put('8',new ArrayList<String>(){{add("w");
add("x");}});
map.put('9',new ArrayList<String>(){{add("y");
add("z");}});
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str1 = scanner.nextLine();
String str2 = scanner.nextLine();
char[] chars = str1.toCharArray();
List<String> result = new ArrayList<>();
StringBuilder sb = new StringBuilder();
recur(result,chars,sb,0);
List<String> result1 = new ArrayList<>();
for(String s : result){
if(!contaisPinBi(s,str2)){
result1.add(s);
}
}
for(String s : result1){
System.out.print(s+",");
}
// System.out.println(contaisPinBi("ux","ux"));
}
private static boolean contaisPinBi(String s, String str2) {
char[] chars = str2.toCharArray();
int count = 0;
for(char ch : chars){
if(s.contains(String.valueOf(ch)))count++;
}
return count==str2.length();
}
private static void recur(List<String> result, char[] chars, StringBuilder sb,int floor) {
if(floor == chars.length){
result.add(sb.toString());
return;
}
List<String> strings = map.get(chars[floor]);
for (String string : strings) {
sb.append(string);
recur(result,chars,sb,floor+1);
sb.deleteCharAt(floor);
}
}
}
不知道会不会有面试机会,也不知道面试难不难,找工作真的好难呀,哭了。

查看21道真题和解析