微软笔试代码交流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

相关推荐

od现在都成这样了&nbsp;就业市场真是crazy
牛客473059135号:没事,我有个朋友是985本硕学计算机的,被华为卡目标院校了简历挂,不过不是od虽然人家拿到一堆别的offer了就挺搞笑的属于是……
点赞 评论 收藏
分享
ResourceUtilization:四六级不愧是大学最有用的证之一
点赞 评论 收藏
分享
xwqlikepsl:感觉很厉害啊,慢慢找
点赞 评论 收藏
分享
评论
16
106
分享

创作者周榜

更多
牛客网
牛客企业服务