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;
    }

全部评论
大佬
1 回复 分享
发布于 2023-09-20 21:16 辽宁
卧槽,大哥
点赞 回复 分享
发布于 2023-09-20 21:07 广东
请问第一题用什么方法做的呀
点赞 回复 分享
发布于 2023-09-20 21:11 上海
没看懂第一题描述只拿了个85走了,第二题也不知道为啥一直85按理来说纯bfs+剪枝应该没啥问题,第三题看了一眼就不想做
点赞 回复 分享
发布于 2023-09-20 21:19 北京
***第三题做不了一点
点赞 回复 分享
发布于 2023-09-20 21:22 广东
我过了第一题和第二题, 最后一题做不了一点,只想到自动向上合成语法节点,但是想想算法实现就头疼
点赞 回复 分享
发布于 2023-09-20 21:30 广东
太强了,浙大爷
点赞 回复 分享
发布于 2023-09-26 15:41 广东

相关推荐

评论
3
21
分享

创作者周榜

更多
牛客网
牛客企业服务