微软8.20笔试

第一题:思路:hashmap+排序队列
public int solution(int[] A) {
        // write your code in Java 8 (Java SE 8)
        HashMap<Integer, PriorityQueue<Integer>> map = new HashMap<>();
        for (int num : A) {
            int temp = num;
            int sum = 0;
            while (temp != 0) {
                sum += temp % 10;
                temp /= 10;
            }
            if (map.containsKey(sum)) {
                map.get(sum).offer(num);
            } else {
                PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> {return b - a;});
                pq.offer(num);
                map.put(sum, pq);
            }
        }
        int res = -1;
        for (Map.Entry<Integer, PriorityQueue<Integer>> entry : map.entrySet()) {
            PriorityQueue<Integer> value = entry.getValue();
            if (value.size() < 2) continue;
            res = Math.max(res, value.poll() + value.poll());
        }
        return res;
    }
第二题:思路:从大到小,先放2*2
public int solution(int M, int N) {
        // write your code in Java 8 (Java SE 8)
        int sum = M + N * 4;
        int right = (int) Math.sqrt(sum);
        while (right > 0) {
            if (check(M, N, right)) return right;
            right--;
        }
        return 0;
    }

    public boolean check(int m, int n, int len) {
        int sum = len * len;
        int count = len / 2;
        int num = count * count;
        num = num > n ? n : num;
        return m >= sum - (4 * num);
    }
第三题:思路:用另外一个矩阵保存当前位置到其他店铺满足距离条件的店铺数量
public int solution(int K, int[][] A) {
        // write your code in Java 8 (Java SE 8)
        int count = 0;
        int m = A.length, n = A[0].length;
        int[][] map = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (A[i][j] == 1) {
                    count++;
                    cal(map, K, i, j, A);
                }
            }
        }
        int res = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (map[i][j] == count) {
                    res++;
                }
            }
        }
        return res;
    }
    void cal(int[][] map, int k, int i, int j, int[][] A) {
        int m = A.length, n = A[0].length;
        int row = i - k >= 0 ? i - k : 0;
        while (row < m) {
            int diff = k - Math.abs(row - i);
            int p = j - diff >= 0 ? j - diff : 0;
            for (; p <= j + diff && p < n; p++) {
                if (A[row][p] != 1) {
                    map[row][p]++;
                }
            }
            row++;
        }
    }



#微软笔试#
全部评论
第三题可以用线性规划(对每个房子,有效的商店都在菱形范围内),第二题可以直接数学计算
点赞 回复 分享
发布于 2022-08-21 12:57 北京
第三题可以用每个房子和距离得到一个菱形,每个菱形取交集不断缩小这个菱形,最后在菱形内的就是商店的位置
点赞 回复 分享
发布于 2022-08-24 10:12 湖北
第三题我也是暴力求解,我觉得会超时,想用矩阵前缀和优化,可对于菱形又有点无从下手
点赞 回复 分享
发布于 2022-08-20 23:55 广东

相关推荐

深夜书店vv:腾讯是这样的,去年很多走廊都加桌子当工区
点赞 评论 收藏
分享
真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
评论
点赞
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务