贝壳813 后端笔试

第一题

题目n 块田,来回施肥,每次施肥加1,共 m
举例:n=3, m=5
[1,0,0] > [1,1,0] > [1,1,1] > [1,2,1] > [2,2,1]
输出 [2,2,1]

数学归纳法 AC

    // 数学归纳法,所以需要去掉一些特殊情况
    public long[] FarmerNN(int n, long m) {
        // write code here
        long[] arr = new long[n];
        // 特殊情况判断
        if (n == 0 || m == 0) return arr;

        if (n == 1) {
            arr[0] = m;
            return arr;
        }

        if (n == 2) {
            Arrays.fill(arr, m / 2);
            if ((m & 1) == 1) arr[0]++;

            return arr;
        }

        if (m < n) {
            for (int i = 0; i < m; i++) {
                arr[i] = 1;
            }

            return arr;
        }

        // 处理除“最后一行”施肥以外的情况
        long cnt = (m - n) / (n - 1);
        int last = (int) ((m - n) % (n - 1));

        for (int i = 1; i <= n - 2; i++) {
            arr[i] = cnt + 1;
        }

        // “最后一行”施肥奇偶分开讨论,这关系到从左开始还是从右开始
        if ((cnt & 1) == 1) {
            arr[0] = (cnt + 1) / 2 + 1;
            arr[n - 1] = arr[0] - 1;

            for (int i = 1; i < last + 1; i++) {
                arr[i]++;
            }

        } else {
            arr[0] = cnt / 2 + 1;
            arr[n - 1] = arr[0];

            for (int i = n - 2; i > n - 2 - last; i--) {
                arr[i]++;
            }

        }

        return arr;
    }

第二题

题目:按字典序从小到大清除字符串 s 中对应字符,清除 k
举例:s="caabeefa", k=2
"caabeefa" > "cbeef" > "ceef"
输出 "ceef"

TreeSet 排序加去重 AC

public String NS_String(String s, int k) {
        // write code here
        Set<Character> tab = new TreeSet<>();
        for (int i = 0; i < s.length(); i++) {
            tab.add(s.charAt(i));
        }

        for (char ch : tab) {
            if (k == 0) break;

            s = s.replaceAll(String.valueOf(ch), "");
            k--;
        }

        return s;
    }

第三题

题目:arr[i] ^ arr[j] == t 则区间[i, j]为奇特区间,包含奇特区间的区间也是奇特区间,找出给定区间 a[] 中非奇特子区间的个数
举例:a[]=[1, 2, 4, 8], t = 6
2 ^ 4 == 6, 非奇特区间为[1, 2],[4, 8]
输出 2

我是用DP O(n2)的空间复杂度..爆内存了 70%

    // 算法与最大回文子串类似
    public long section(int[] a, int t) {
        // write code here

        int n = a.length;
        boolean[][] dp = new boolean[n][n];

        int cnt = 0;
        for (int left = n - 2; left >= 0; left--) {
            for (int right = left + 1; right < n; right++) {
                if ((a[left] ^ a[right]) == t) {
                    dp[left][right] = true;
                } else if (dp[left + 1][right - 1] || dp[left][right - 1] || dp[left + 1][right]) {
                    dp[left][right] = true;
                }
                if (!dp[left][right]) cnt++;
            }
        }

        return cnt;
    }

第四题

题目:最大同构子树
最后时间不太够就没做了,用dfs就可以了,leetcode有类似的题。

return 0; A了 9% hhh

#贝壳笔试##笔经##贝壳找房#
全部评论
后两题挺难的,我一个0.3一个0.36😂
点赞 回复 分享
发布于 2021-08-14 09:13

相关推荐

和蔼:在竞争中脱颖而出,厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
尊尼获获:闺蜜在哪?
点赞 评论 收藏
分享
1 13 评论
分享
牛客网
牛客企业服务