华为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); } } }
不知道会不会有面试机会,也不知道面试难不难,找工作真的好难呀,哭了。
#华为机试,emo了##华为od机试##华为od面经##华为od捞人#