腾讯音乐娱乐 2022届校园招聘 C++笔试编程题目

embracestar 2022-07-21 05:20:11 阅读数:482

腾讯娱乐音乐招聘校园

试卷情况


试卷包括4道题,3道编程题,1道问答题,限时100分钟。


第一道编程题

题目:牛牛有一个仅仅由字符’1’到’9’组成的长度为n的字符串s,现在牛牛可以截取其中一段长度为k的子串当做十进制的正整数,如对于子串"123",其对应的十进制数字就是123。牛牛想让这个正整数尽可能的大,请你帮助牛牛计算该正整数。函数传入一个长度为n的字符串s和一个正整数k,请你返回答案。

备注:主要考察字符串和十进制数字之间转换。

class Solution {

public:
int maxValue(string s, int k) {

int n = s.size(), ans = 0;
for (int i = 0; i <= n - k; ++i) {

int t = 0;
for (int j = 0; j < k; ++j) {

t = t * 10 + (s[i + j] - '0');
}
ans = max(ans, t);
}
return ans;
}
};

输入"321456987"和3得到结果987。



第二道编程题

题目:牛牛有一颗有n个节点的二叉树,其根节点为root。牛牛想修剪掉当前二叉树的叶子节点,但是牛牛不能直接删除叶子节点。他只能修剪叶子节点的父节点,修剪了父节点了之后,叶子节点也会对应删掉,牛牛想在留下尽可能多的节点前提下,修剪掉所有的叶子节点。请你返回修剪后的二叉树。

备注:这一题写不出来,后来参考一位大佬的Python代码复现的,其中pair第一个值表示该节点是否是叶子节点,第二个值表示该节点是否该删除。

class Solution {

private:
pair<bool, bool> dfs(TreeNode* root) {

if (!root) {

return {
 false, false };
}
pair<bool, bool> lp, rp;
if (root->left) {

lp = dfs(root->left);
}
if (root->right) {

rp = dfs(root->right);
}
if (lp.first || rp.first) {

return {
 false, true };
}
if (lp.second) {

root->left = nullptr;
}
if (rp.second) {

root->right = nullptr;
}
return {
 true, false };
}
public:
TreeNode* pruneLeaves(TreeNode* root) {

TreeNode* t = new TreeNode(-1);
t->left = root;
dfs(t);
root = t->left;
delete t;
t = nullptr;
return root;
}
};

第三道编程题

题目:牛妹给了牛牛一个长度为n的下标从零开始正整数型数组a,粗心的牛牛不小心把其中的一些数字删除了。加入ai被删除了,则ai=0。对于所有被删除的数字,牛牛选择一个正整数填上。现在牛牛想知道有多少种填充方案使得:a0≤a1≤…≤an-1且对于所有的0≤i≤n-1满足1≤ai≤k。函数传入一个下标从0开始的数组a和一个正整数k,请返回合法的填充方案数对10^9+7取模的值,保证不存在方案数为0的数据。

备注:知道这一题应该用动态规划但写不出来,以下题解出自同一位Python大佬,我用C++复现了一下。

class Solution {

private:
int dfs(int p, int q, map<pair<int, int>, int>& map) {

if (map.count({
 p, q })) {

return map[{
p, q}];
}
if (p == 0 || q == 0) {

return 1;
}
if (p == 1) {

return q;
}
if (q == 1) {

return 1;
}
map[{
p, q}] = (dfs(p - 1, q, map) + dfs(p, q - 1, map)) % ((int)pow(10, 9) + 7);
return map[{
p, q}];
}
public:
int fillArray(vector<int>& a, int k) {

map<pair<int, int>, int> map;
a.insert(a.begin(), 1);
a.emplace_back(max(a[a.size() - 1], k));
int idx = 0, ans = 1;
for (int i = 1; i < a.size(); ++i) {

if (a[i] != 0) {

ans = ans * dfs(i - idx - 1, a[i] - a[idx] + 1, map) % ((int)pow(10, 9) + 7);
idx = i;
}
}
return ans;
}
};


本人只是一名编程小白,写博客是为了总结和交流,恳请大家批评指正!

版权声明:本文为[embracestar]所创,转载请带上原文链接,感谢。 https://blog.csdn.net/embracestar/article/details/119946009