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

试卷情况


试卷包括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;
	}
};


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

猜你喜欢

转载自blog.csdn.net/embracestar/article/details/119946009