20230920 华为笔试 591 (附代码)
最后一题也太恶心了,不知道哪个样例没过
t1:过了100%
先找到最小的值的下标比如说是x,那么先遍历x->n-1再遍历 0->x-1,记录满足target的下标就可以了
代码丢了
t2:过了100%
bfs遍历就可以了
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); int[][] mp = new int[n][m]; int[][] dp = new int[n][m]; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { mp[i][j] = scanner.nextInt(); dp[i][j] = Integer.MAX_VALUE; } } LinkedList<int[]> que = new LinkedList<>(); for (int i = 0; i < n; ++i) { if (mp[i][0] == 1) { dp[i][0] = 0; que.add(new int[]{i, 0}); } } int cnt = 1; int[][] dir = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; while (!que.isEmpty()) { int size = que.size(); for (int i = 0; i < size; ++i) { int[] first = que.pollFirst(); mp[first[0]][first[1]] = 0; for (int j = 0; j < 4; ++j) { int dx = first[0] + dir[j][0]; int dy = first[1] + dir[j][1]; if (dx < 0 || dx >= n || dy < 0 || dy >= m || mp[dx][dy] == 0 || dp[dx][dy] != Integer.MAX_VALUE) continue; dp[dx][dy] = cnt; que.addLast(new int[]{dx, dy}); } } cnt++; } int res = Integer.MAX_VALUE; for (int i = 0; i < n; ++i) { res = Math.min(res, dp[i][m - 1]); } if (res == Integer.MAX_VALUE) res = -1; System.out.println(res); }
t3 只过了97%,纯模拟题,需要注意一些细节的处理
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()) { String s = scanner.nextLine(); if (s.startsWith("let")) { String fieldName = getFieldName(s); if (fieldName == null) continue; mp.put(fieldName, delParam(s)); } else if (s.startsWith("out")) { String fieldName = s.substring(4, s.length() - 1); System.out.println(mp.getOrDefault(fieldName, "<undefined>")); } else { System.out.println("<syntax-error>"); } } } static HashMap<String, Object> mp = new HashMap<>(); static String getFieldName(String s) { String[] f1 = s.split("="); if (f1.length > 2) { System.out.println("<syntax-error>"); return null; } String fieldName = f1[0].trim().substring(4); if (fieldName.charAt(0) >= '0' && fieldName.charAt(0) <= '9') { System.out.println("<syntax-error>"); return null; } for (int i = 0; i < fieldName.length(); ++i) { char c = fieldName.charAt(i); if (!checkValid(c)) { System.out.println("<syntax-error>"); return null; } } return fieldName; } static Object delParam(String s) { String[] f1 = s.split("="); String o = f1[1].trim(); StringBuilder pre = new StringBuilder(); BigInteger v = new BigInteger("0"); char op = ' '; for (int i = 0; i < o.length(); ++i) { char c = o.charAt(i); if (checkValid(c)) { pre.append(o.charAt(i)); } else { if (pre.length() != 0) { Object r = cul(pre, op, v); if (r instanceof BigInteger) { v = (BigInteger) r; } else { return r; } pre = new StringBuilder(); } if (c == '+' || c == '-' || c == '/' || c == '*') { op = c; } } } if (pre.length() != 0) { Object r = cul(pre, op, v); if (r instanceof BigInteger) { v = (BigInteger) r; } else { return r; } } return v; } //对参数pre进行计算 static Object cul(StringBuilder pre, char op, BigInteger v) { BigInteger pv; try { Long.parseLong(pre.toString()); pv = new BigInteger(pre.toString()); } catch (NumberFormatException e) { String param = pre.toString(); if (!mp.containsKey(param)) { return "<undefined>"; } else if (mp.get(param) instanceof String) { return mp.get(param); } pv = new BigInteger(((BigInteger) mp.get(param)).toByteArray()); } if (op == ' ') { v = pv; } else { v = opNum(v, pv, op); } if (v.compareTo(new BigInteger(String.valueOf(Integer.MAX_VALUE))) > 0) { return "<overflow>"; } else if (v.compareTo(new BigInteger(String.valueOf(Integer.MIN_VALUE))) < 0) { return "<underflow>"; } return v; } //执行算子 static BigInteger opNum(BigInteger pre, BigInteger cur, char op) { if (op == '+') { pre = pre.add(cur); } else if (op == '-') { pre = pre.subtract(cur); } else if (op == '*') { pre = pre.multiply(cur); } else if (op == '/') { pre = pre.divide(cur); } return pre; } //判断字符是否合法 static boolean checkValid(char c) { if (c >= '0' && c <= '9') { } else if (c >= 'a' && c <= 'z') { } else if (c >= 'A' && c <= 'Z') { } else if (c == '_') { } else { return false; } return true; }