725用友Java开发笔试
选择太难了,而且每部分都要提交了才能看下一部分的题,搞得我好紧张,又怕前面的题选的太草率丢分多,又怕时间都浪费在前边了编程题没时间做。SQL的题以前只背了八股每怎么练过,就直接放弃了,结果两道编程题做完还有8分多钟干瞪眼。呜呜能不能全部做完提交了还有时间的话再给点时间反刍前边的题呀,太心疼那道SQL了。
编程题1:大概是有一个九键手机键盘,每个键代表三个或四个字符,如果想按某个键的第一个字符就要按这个键一下,如果想按某个键的第二个字符就要按这个键两下以此类推,问给定一个字符串,统计按下某个键的次数,以列表数组形式输出。
public int[][] count(String str) { // write code here if (str == null || str.length() == 0) { return new int[0][0]; } int n = str.length(); HashMap<Integer, Integer> map = new HashMap<>(); char c; for (int i = 0; i < n; i++) { c = str.charAt(i); if (c == '@' || c == '!' || c == '.' || c == '/') { if (c == '@') { map.put(1, map.getOrDefault(1, 0) + 1); } else if (c == '!') { map.put(1, map.getOrDefault(1, 0) + 2); } else if (c == '.') { map.put(1, map.getOrDefault(1, 0) + 3); } else if (c == '/') { map.put(1, map.getOrDefault(1, 0) + 4); } } if (c == 'a' || c == 'b' || c == 'c') { if (c == 'a') { map.put(2, map.getOrDefault(2, 0) + 1); } else if (c == 'b') { map.put(2, map.getOrDefault(2, 0) + 2); } else if (c == 'c') { map.put(2, map.getOrDefault(2, 0) + 3); } } if (c == 'd' || c == 'e' || c == 'f') { if (c == 'd') { map.put(3, map.getOrDefault(3, 0) + 1); } else if (c == 'e') { map.put(3, map.getOrDefault(3, 0) + 2); } else if (c == 'f') { map.put(3, map.getOrDefault(3, 0) + 3); } } if (c == 'g' || c == 'h' || c == 'i') { if (c == 'g') { map.put(4, map.getOrDefault(4, 0) + 1); } else if (c == 'h') { map.put(4, map.getOrDefault(4, 0) + 2); } else if (c == 'i') { map.put(4, map.getOrDefault(4, 0) + 3); } } if (c == 'j' || c == 'k' || c == 'l') { if (c == 'j') { map.put(5, map.getOrDefault(5, 0) + 1); } else if (c == 'k') { map.put(5, map.getOrDefault(5, 0) + 2); } else if (c == 'l') { map.put(5, map.getOrDefault(5, 0) + 3); } } if (c == 'm' || c == 'n' || c == 'o') { if (c == 'm') { map.put(6, map.getOrDefault(6, 0) + 1); } else if (c == 'n') { map.put(6, map.getOrDefault(6, 0) + 2); } else if (c == 'o') { map.put(6, map.getOrDefault(6, 0) + 3); } } if (c == 'p' || c == 'q' || c == 'r' || c == 's') { if (c == 'p') { map.put(7, map.getOrDefault(7, 0) + 1); } else if (c == 'q') { map.put(7, map.getOrDefault(7, 0) + 2); } else if (c == 'r') { map.put(7, map.getOrDefault(7, 0) + 3); } else if (c == 's') { map.put(7, map.getOrDefault(7, 0) + 4); } } if (c == 't' || c == 'u' || c == 'v') { if (c == 't') { map.put(8, map.getOrDefault(8, 0) + 1); } else if (c == 'u') { map.put(8, map.getOrDefault(8, 0) + 2); } else if (c == 'v') { map.put(8, map.getOrDefault(8, 0) + 3); } } if (c == 'w' || c == 'x' || c == 'y' || c == 'z') { if (c == 'w') { map.put(9, map.getOrDefault(9, 0) + 1); } else if (c == 'x') { map.put(9, map.getOrDefault(9, 0) + 2); } else if (c == 'y') { map.put(9, map.getOrDefault(9, 0) + 3); } else if (c == 'z') { map.put(9, map.getOrDefault(9, 0) + 4); } } } int[][] ans = new int[map.keySet().size()][2]; int idx = 0; for (int i = 0; i < 9; i++) { if (map.get(i + 1) != null) { ans[idx][0] = i + 1; ans[idx][1] = map.get(i + 1); idx++; } } return ans; }编程题第二题:给一个01组成的数组,和一个整数n,最多有n次将任意数反转的机会,问能得到的最长连续相同字符的子数组长度是多少,刚开始想用动规,但是有点解不出来,最后用了双指针。
public int getMaxConsecutiveOnes(int[] arr, int n) { // write code here int left = 0; int count = 0; int max = 0; for (int i = 0; i < arr.length; i++) { if (arr[i] == 1) { continue; } else if (arr[i] == 0 && count < n) { count++; } else { max = Math.max(max, (i - left)); while (arr[left] != 0) { left++; } left++; } } max = Math.max(max, arr.length - left); return max; }