8.13 贝壳笔试统计+AK参考代码



2021-08-13 更新

考试时间 20:00 - 22:00,四道编程题。

前三题都比较简单,第四题直接递归把树转化为字符串,用 C++ 内存超限只过了90%多的数据,用Python直接ac了。开始以为子树是任意的子结构都行,实际上是包含该节点和所有的子节点。

回忆了下所有题的代码,作为参考:

第一题

vector<long long> solve(int n, long long m) {
    // [0, n-1],从 1 的位置开始洒,最后 a[0] 加 1,最后洒到的位置减去 1
    long long div = m / (n - 1), mod = m % (n - 1);
    vector<long long> ans(n);
    for (int i = 1; i < n; ++i) {
        ans[i] = (div + 1) / 2;
    }
    for (int i = n - 2; i >= 0; --i) {
        ans[i] = div / 2;
    }
    int last = 0;
    if (div & 1) {
        if (mod == 0) {
            last = n - 1;
        } else {
            for (int i = n - 2; i >= 0 && mod; --i, --mod) {
                ans[i] += 1;
                last = i;
            }
        }
    } else {
        if (mod == 0) {
            last = 0;
        } else {
            for (int i = 1; i < n && mod; ++i, --mod) {
                ans[i] += 1;
                last = i;
            }
        }
    }
    ans[0] += 1;
    ans[last] -= 1;
    return ans;
}

第二题

string solve(string s, int k) {
    // 每次删除 s 中最小的字符,共删除 k 次
    // 笔试时我直接用的 set 做的,但是用位运算更优
    int mask = 0;
    for (char c : s) {
        mask |= 1 << (c - 'a');
    }
    for (int i = 0; i < 26 && k; ++i) {
        if (mask & (1 << i)) {
            mask &= ~(1 << i);
            k -= 1;
        }
    }
    string ans;
    for (char c : s) {
        if (mask & (1 << (c - 'a'))) {
            ans += c;
        }
    }
    return ans;
}

第三题

long long solve(vector<int> &a, int t) {
    int n = a.size();
    long long ans = 0;
    unordered_map<int, int> index;
    int pre = 0;
    for (int i = 0; i < n; ++i) {
        int b = a[i] ^ t;
        int k = index.count(b) ? index[b] + 1 : 0;
        k = max(k, pre);
        pre = k;
        ans += i - k;
        index[a[i]] = i;
    }
    return ans;
}

第四题

import sys
from collections import defaultdict

sys.setrecursionlimit(100005)


def solve(root):
    pattern = defaultdict(int)
    size = defaultdict(int)

    def dfs(root):
        if root is None:
            return ("()", 0)
        l_s, l_cnt = dfs(root.left)
        r_s, r_cnt = dfs(root.right)
        s = "(" + l_s + str(root.val) + r_s + ")"
        cnt = 1 + l_cnt + r_cnt
        pattern[s] += 1
        size[s] = cnt
        return (s, cnt)

    dfs(root)
    ans = 0
    for k, v in pattern.items():
        if v > 1:
            ans = max(ans, size[k])
    return ans







#贝壳##笔试题型##贝壳找房#
全部评论
我太菜了,前三道中的比较简单码
点赞 回复 分享
发布于 2021-08-13 22:12
第三题能说说思路吗老哥
点赞 回复 分享
发布于 2021-08-13 22:14
第三题怎么做呀大佬
点赞 回复 分享
发布于 2021-08-13 22:17
假设有数组[1,2,3,4,5],这里的1,2,3,4,5不代表数组中的值,表示索引。下同。 如果[2,3]处的值可以异或成t,那么区间有[1,2,3],[1,2,3,4],[1,2,3,4,5],[2,3],[2,3,4],[2,3,4,5]这6个区间。我们将这个6个区间以左端点和右端点组成一对xy坐标放到二维坐标上。 如下第一张图 如果还有其他的点可以异或成t,假设[3,4]。由[3,4]可得的区间有[1,2,3,4],[2,3,4],[3,4],[3,4,5],同样可以处理到坐标轴上。如第二张图。 我们只要计算最后没有被覆盖到的面积。即可。
点赞 回复 分享
发布于 2021-08-14 00:12
第二题, Python 超级简单, 你直接循环 k 次从 'a&(417)#39; 遍历到 'z&#39; replace 一下就行了
点赞 回复 分享
发布于 2021-08-16 09:35
有人收到面试通知了吗
点赞 回复 分享
发布于 2021-08-18 09:58

相关推荐

10-25 23:12
门头沟学院 Java
点赞 评论 收藏
分享
Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
评论
1
15
分享
牛客网
牛客企业服务