首页 > 8.13 贝壳笔试统计+AK参考代码
头像
LifeAndDonuts
编辑于 2021-08-13 23:40
+ 关注

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







全部评论

(6) 回帖
加载中...
话题 回帖