微软笔试代码交流8.13

贴一下题目吧,从别的帖子捞过来的😂😂😂

微软笔试是两点结束吗?那就等会再发吧

上周的笔试写完第一题后就点了submit,然后就结束了,哭死😂😂😂。希望这次能过吧,贴一下代码,供大家参考
第二题的时间复杂度不知道顶不顶得住,其他两题感觉应该还ok
图片说明

    // 第一题:将A中的某个数字减少一半,最少需要多少次后,数组的和小于等于原来数组和的一半
    // 思路:贪心,大根堆
    public int solution(int[] A) {
        // write your code in Java 8 (Java SE 8)
        PriorityQueue<Double> heap = new PriorityQueue<>((a, b) -> {
            if (a.equals(b)) return 0;
            else return a > b ? -1 : 1;
        });
        int sum = 0;
        for (int n : A) {
            sum += n;
            heap.offer((double) n);
        }
        int res = 0;
        double reduce = 0;
        while (reduce * 2 < sum) {
            double cur = heap.poll();
            cur /= 2;
            reduce += cur;
            heap.offer(cur);
            res++;
        }
        return res;
    }

图片说明

    // 第二题,x[i]/y[i] + x[j]/y[i] = 1的pair数,对1e9+7取模
    // 思路:双指针,两数之和
    public int solution(int[] X, int[] Y) {
        // write your code in Java 8 (Java SE 8)
        int mod = (int) (1e9 + 7);
        int n = X.length;
        double[] fractions = new double[n];
        for (int i = 0; i < n; i++) {
            fractions[i] = ((double) X[i]) / Y[i];
        }
        Arrays.sort(fractions);
        long res = 0;
        for (int i = 0, j = n - 1; i < j; ) {
            double sum = fractions[i] + fractions[j];
            if (sum == 1) {
                int left = 1, right = 1;
                while (i + 1 < n && fractions[i] == fractions[i + 1]) {
                    i++;
                    left++;
                }
                while (j - 1 >= 0 && fractions[j] == fractions[j - 1]) {
                    j--;
                    right++;
                }

                if (i < j) {
                    res = (res + left * right % mod) % mod;
                } else {
                    res = (res + (left - 1) * left / 2 % mod) % mod;
                }
                i++;
                j--;
            } else if (sum > 1) {
                j--;
            } else {
                i++;
            }
        }
        return (int) res;
    }

感谢评论区大佬的思路,更新下第二题map做法

    // 第二题,x[i]/y[i] + x[j]/y[i] = 1的pair数,对1e9+7取模
    // 思路:map
    public int solution(int[] X, int[] Y) {
        // write your code in Java 8 (Java SE 8)
        int mod = (int) (1e9 + 7);
        int n = X.length;
        long res = 0;
        Map<Integer, Map<Integer, Integer>> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            int gcg = gcd(X[i], Y[i]);
            int up = X[i] / gcg;
            int down = Y[i] / gcg;
            Map<Integer, Integer> curMap = map.computeIfAbsent(down, k -> new HashMap<>());
            res = (res + curMap.getOrDefault(down - up, 0)) % mod;
            curMap.put(up, curMap.getOrDefault(up, 0) + 1);
        }
        return (int) res;
    }

    public int gcd(int a, int b) {
        if (b == 0) return a;
        return gcd(b, a % b);
    }

图片说明

    // 第三题,数组A中每间隔Y-1个的连续X个数的最小和
    // 思路:滑动窗口
    public int solution(int[] A, int X, int Y) {
        // write your code in Java 8 (Java SE 8)
        int n = A.length;
        int res = Integer.MAX_VALUE;
        for (int i = 0; i < Y; i++) {
            int left = i, right = i;
            int sum = 0;
            int count = 0;
            while (right < n) {
                sum += A[right];
                right += Y;
                count++;
                while (count == X) {
                    res = Math.min(res, sum);
                    sum -= A[left];
                    left += Y;
                    count--;
                }
            }
        }
        return res;
    }
#微软笔试#
全部评论
第二题只要用排序复杂度就高了啊😂
点赞 回复 分享
发布于 2022-08-13 14:53
牛啊,我是一个都不会。。
点赞 回复 分享
发布于 2022-08-13 14:50
第三题我还以为x是不连续的,用了动态规划😨,难顶
点赞 回复 分享
发布于 2022-08-13 14:30
第二题也有点问题吧,精度1/3+2/3不等于1吧我用的最小公约数
点赞 回复 分享
发布于 2022-08-13 15:19
我好蠢😂第二题没看到是pair,直接dfs硬搜去了
2 回复 分享
发布于 2022-08-13 17:58
求一个题目
1 回复 分享
发布于 2022-08-13 14:36
求问用Python的话,第二题用Python的Fraction库做可以吗 看了一圈感觉都是求最大公约数 没有直接调库的😂
点赞 回复 分享
发布于 2022-08-14 14:25
请问用最大公约数是怎么解的呀? 不应该是用最大公倍数吗?不太理解
点赞 回复 分享
发布于 2022-08-14 00:55
想请教一下,在n[i] ==n[i+1 ]这个循环里的res = (res + (left - 1) * left / 2,这个式子是怎么得到的呢
点赞 回复 分享
发布于 2022-08-13 15:26
不知道第一道题用double会不会出现精度问题
1 回复 分享
发布于 2022-08-13 18:17
第二题我看到除法就给转成了最小公倍数的整数去做,不过一想最后可能lcm越界了😂
1 回复 分享
发布于 2022-08-13 18:10
有没有大佬用c++翻译翻译
点赞 回复 分享
发布于 2022-08-13 17:28
第二题 :x1/y1,x2/y2,直接判断x1*y2 + x2*y1 == y1*y2 就行了吧,int就能做
3 回复 分享
发布于 2022-08-18 15:12 河南
第二题用的回溯咋整
1 回复 分享
发布于 2022-08-18 10:07 江苏
submit之后还可以接着做哦
点赞 回复 分享
发布于 2022-08-24 01:19 香港
楼主我想请教下取模那里,有什么自学的搜索关键词吗😁 都不知道怎么查
点赞 回复 分享
发布于 2022-08-23 18:29 北京
这个不能看最终分数可太难受了,三个题测试用例都过了,就不知道那些corner case 能不能过。😐
点赞 回复 分享
发布于 2022-08-19 18:22 上海
请问微软可以用本地IDE嘛
点赞 回复 分享
发布于 2022-08-17 22:41 北京
话说这个codility进去是不用登陆的对吗?不想牛客网的笔试那样有名字确认?😐
点赞 回复 分享
发布于 2022-08-16 15:41
大佬来试试华勤技术,内推码:NTAKLE0,详情可看帖子https://www.nowcoder.com/discuss/1016547
点赞 回复 分享
发布于 2022-08-16 11:44

相关推荐

08-12 13:45
门头沟学院 Java
点赞 评论 收藏
分享
驼瑞驰_招募评论官版...:点击就挂,露头就秒
点赞 评论 收藏
分享
头像
08-13 14:20
已编辑
门头沟学院 Java
之前在学校的时候,舍友老是熬夜打游戏,周末还喜欢早起打游戏😅,吵得没法睡到自然醒现在出来实习独居后,想干嘛就干嘛,打游戏刷视频,没有任何顾虑,学习工作,也没有人能打扰我🦌就这个独居爽
天才无敌小土豆:之前在学校 宿舍一个巨瘦的哥们天天熬夜打游戏 呼噜声还巨大 我睡觉超级敏感 天天睡不着 我睡他下铺 半夜踹他床板让他飞起来 就那一会不会打呼噜 然后继续 那段时间我感觉我都yw了 后来我换了个远一点的床铺 买了新的那种可以捏小的耳塞 老子睡觉爽死了 后悔大三才发现这种耳塞 老子yw又好了 天天夜里上厕所都梆硬
独居后,你的生活是更好了...
点赞 评论 收藏
分享
评论
16
106
分享

创作者周榜

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