贝壳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

相关推荐

1 13 评论
分享
牛客网
牛客企业服务