百度暑期笔试编程题 【2023-3-13】

A题

一个字符串能否重新排列成 "Baidu"

#include <bits/stdc++.h>
using i64 = long long;

void solve() {
    std::string s;
    std::cin >> s;
    if (s.size() != 5) {
        std::cout << "No\n";
        return;
    }
    
    std::string t = "Baidu";
    std::set<char> S;
    for (auto ch : s) {
        S.insert(ch);
    }
    for (auto ch : t) {
        if (!S.count(ch)) {
            std::cout << "No\n";
            return;
        }
    }
    std::cout << "Yes\n";
}

int main() {
    std::ios::sync_with_stdio(0);
    std::cin.tie(nullptr);
    
    int T;
    std::cin >> T;
    while (T--) {
        solve();
    }
    
    return 0;
}

B题

r,e,d三个字符,能否构成含有 cnt 个回文串的字符串 s

  • 1cnt1091\le cnt\le 10^9
  • 1len(s)1051\le len(s)\le 10^5

二分找最大就行

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::ios::sync_with_stdio(0);
    std::cin.tie(nullptr);
    
    int x;
    std::cin >> x;
    
    int cnt = 0, cur = 0;
    std::string s = "red";
    std::string ans;
    while (cnt < x) {
        int lo = 1, hi = 1e5;
        while (lo < hi) {
            int mid = (lo + hi + 1) / 2;
            if (1ll * mid * (mid + 1) / 2 > x - cnt) {
                hi = mid - 1;
            } else {
                lo = mid;
            }
        }
        cnt += 1ll * hi * (hi + 1) / 2;
        for (int i = 0; i < hi; i++) {
            ans += s[cur];
        }
        cur = (cur + 1) % 3;
    }
    
    std::cout << ans << "\n";
    
    return 0;
}

C题

树形dp

dp[u]dp[u] 是为以 u 为根节点,该树包含同色连通块的数量。

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::ios::sync_with_stdio(0);
    std::cin.tie(nullptr);
    
    int n;
    std::string s;
    std::cin >> n >> s;
    std::vector adj(n, std::vector<int>());
    std::vector<int> dp(n, 1);
    for (int i = 0; i < n - 1; i++) {
        int u, v;
        std::cin >> u >> v;
        u--, v--;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    
    i64 ans = 0;
    auto dfs = [&](auto self, int x, int fa) -> void {
        for (auto y : adj[x]) {
            if (y == fa) continue;
            self(self, y, x);
            if (s[x] != s[y]) {
                dp[x] += dp[y];
            } else {
                dp[x] += dp[y] - 1;
            }
        }
    };
    
    auto calc = [&](auto self, int x, int fa) -> void {
        for (auto y : adj[x]) {
            if (y == fa) continue;
            self(self, y, x);
            if (s[x] == s[y]) {
                ans += std::abs(dp[0] - dp[y] + 1 - dp[y]);
            } else {
                ans += std::abs(dp[0] - dp[y] - dp[y]);
            }
        }
    };
    
    dfs(dfs, 0, -1);
    calc(calc, 0, -1);
    std::cout << ans << "\n";
    
    return 0;
}
#笔试##我的实习求职记录##我的求职思考##如何看待2023届秋招##百度#
全部评论
大佬!我没有议题AC的
2 回复 分享
发布于 2023-03-13 21:16 美国
第二题o(1)可以做,放int(n-1)个’r’,然后再放’red’的倍数让串长度等于x,其中n(n+1)/2=x
2 回复 分享
发布于 2023-03-13 21:23 江苏
一个B题的思路 B题先填充相同的字符(比如r),然后依次填充e、d、r package main import ( "fmt" "math" "strings" ) func main() { x := 0 fmt.Scan(&x) n := math.Floor(0.5 * (-1 + math.Sqrt(1.0+8.0*float64(x)))) var res strings.Builder res.Grow(100000) for i := 0; i < int(n); i++ { res.WriteByte('r') } x = x - int(n*(n+1)/2.0) for i := 0; i < x; i++ { if i%3 == 0 { res.WriteByte('e') } else if i%3 == 1 { res.WriteByte('d') } else { res.WriteByte('r') } } fmt.Println(res.String()) }
2 回复 分享
发布于 2023-03-13 21:42 江苏
有无java版本的
1 回复 分享
发布于 2023-03-13 21:17 美国
好厉害好厉害,我第三题没看得懂菜狗还没怎么刷题,来试试水
1 回复 分享
发布于 2023-03-13 21:38 上海
第二题这么写,rrrrree,rree这种不会算回文子串的个数么,我也是这个思路,只过了40
1 回复 分享
发布于 2023-03-13 21:43 四川
哇,第二题想复杂了,难受,原来找到最大重复数以后,一直循环填red就行了。难受😣
1 回复 分享
发布于 2023-03-13 21:55 陕西
问问楼主,这个lambda中的self为什么查不到有关的资料呢?我看网上用lambda递归都是用的function
点赞 回复 分享
发布于 2023-03-13 21:17 广东
大佬,第三题的同色连通块数怎么理解?看半天看不懂
点赞 回复 分享
发布于 2023-03-13 21:23 广东
B题这个 1ll * mid * (mid + 1) / 2 > x - cnt 是什么意思
点赞 回复 分享
发布于 2023-03-13 21:29 湖北
tql 我第三题没时间了
点赞 回复 分享
发布于 2023-03-13 21:34 广东
你这第三题递归好牛。我思路和你一样,只是构造了一棵树去递归遍历,内存超了。如果我会你这么遍历,估计也AC了
点赞 回复 分享
发布于 2023-03-13 21:48 天津
大佬太强了
点赞 回复 分享
发布于 2023-03-13 22:00 天津
小菜鸡 T1只过了57.14%,求大佬帮看!我觉得自己的思路是对的Orz ``` #include <bits> #include <cstdio> using namespace std; int main() { int N; cin >> N; string s; string t = "Baidu"; for (int i = 0; i < N; i++) { cin >> s; int n = s.size(), cnt = 0; for (int i = 0; i < n; i++) { if (t.find(s[i]) != string::npos) { cnt++; } } if (cnt == 5 && n == cnt) cout << "Yes" << endl; else cout << "No" << endl; } return 0; } ```</cstdio></bits>
点赞 回复 分享
发布于 2023-03-14 11:08 北京
第三题写的真牛啊,我什么时候可以这么强
点赞 回复 分享
发布于 2023-03-14 12:02 香港

相关推荐

一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
09-30 19:49
起名星人:蛮离谱的,直接要求转投销售
投递汇川技术等公司10个岗位
点赞 评论 收藏
分享
17 61 评论
分享
牛客网
牛客企业服务