【腾讯】暑期实习-PC客户端开发岗位笔试

  1. 链表反转

以4个元素为一组,两个元素为1个小组,反转,组内元素顺序不变。瞎几把写的,因为我想火速AC。

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* reorderList(ListNode* head) {
        cout << 1 << endl;
        vector<int> vec;
        auto p = head;

        while(p){
			vec.push_back(p->val);
			p=p->next;
        }
		if(vec.size() <= 2) return head;
		for(int i = 0 ;i+3 <vec.size() ; i +=4){
			int b,c,d;
			int a = i;
			b = i+1;
			c = i + 2;
			d = i+3;
			swap(vec[a],vec[c]);
			if(d < vec.size())
				swap(vec[b],vec[d]);
			else
				swap(vec[b],vec[c]);
		}
		for(auto it: vec)
			cout << it << " ";
		cout << endl;
		ListNode* new_head = new ListNode({});
		p = new_head;
        for(int i = 0 ; i < vec.size() ; ++i){
			if(i == 0){
				p->val = vec[i];
				p->next = nullptr;
			}else{
				auto temp = new ListNode({});
				temp->val = vec[i];
				temp->next = nullptr;
				p->next = temp;
				p = temp;
			}
		}
        return new_head;
    }
};

2 树的节点判断

满二叉树,给你节点,问你是不是叶子节点,存不存在。

#include <iostream>
#include <cmath>
#include <vector>
// #include <map>
#include <unordered_map>
using namespace std;

int main(){
	int n; //level
	cin >> n;
	unordered_map<int,int> mp;
	int m = pow(2,n)-1;
	vector<int> vec(m+1);
	for(int i =1 ; i <= m ; ++i){
		cin >> vec[i];
		int v;
		v = vec[i];
		// mp[vec[i]]
		mp[v] = i;
	}
	// int level = sqrt(n) + 1;
	int q;
	cin >> q;
	while(q--){
		int node;
		cin >> node;
		if(mp.find(node) == mp.end()) cout << "NO" << endl;
		else{
			cout << "YES" << endl;
			int pos = mp[node];
			int left,right;
			left = 2*pos;
			right = left+1;
			if(left >= m && right >= m){
				cout << "LEAF" << endl;
			}else{
				if(left <= m)
					cout << vec[left];
				if(right <= m )
					cout << " " << vec[right];
				cout << endl;
			}
		}
	}
	return 0;
}

5 寻路

障碍寻路,弱智dp。

#include <iostream>
#include <vector>

using namespace std;
typedef long long ll;
ll mod = 1e9 +7 ;
int vec[2000+1][2000+1];
int dp[2000+1][2000+1];
bool row[2000+1];
bool col[2000+1];
int main(){
	int m,n;
	cin >> m >> n;

	for(size_t i = 1 ; i <= m ; ++i){
		for (size_t j = 1; j <= n; j++)
		{
			char ch;
			cin >> ch;
			if(ch == '.')
			vec[i][j] = 1;
			else{
				vec[i][j] = 0;
			}
		}
	}
	for(int i = 1; i <=m ; ++i)
	{
		for(int j = 1 ; j <= n ; ++j)
		{
			if(i ==1 && j == 1 ){
				dp[i][j] = 1;
				continue;
			}
			if(vec[i][j] == 1){
				for(int k = j -1 ; k >= 1 && vec[i][k] == 1; --k)
					dp[i][j] = (dp[i][j] + dp[i][k])%mod;
				for(int k = i -1 ; k >= 1 && vec[k][j] == 1; --k)
					dp[i][j] = (dp[i][j] + dp[k][j])%mod;
			}
		}
	}
	cout <<dp[m][n] << endl;
	return 0;
}

3 字符串

想用的模拟,没写出来,debug太长时间了。。

题目就是给你字符串,可以对子串(如果是回文)进行折叠,比如说aabaa->aab/bba->ab\ba...

#include <iostream>
#include <set>
#include <vector>
#include <unordered_map>
using namespace std;
unordered_map<string,int> mp;
bool isstr(string str){
	if(mp[str] != 0){
		return true;
	}
	int len = str.length();
	for(int i = 0 ; i < len/2 ; ++i){
		if(str[i] != str[len-i-1]) return false;
	}
	
	return true;
}
int ans = 0;
void calc(string str){
	int len = str.length();
	if(len == 1) return ;
	if(mp[str]){
		ans += mp[str];
		return ;
	}
	int ans = 0;
	for (size_t i = 0; i < len; i++)
	{
		for (size_t j = i; j < len; j++)
		{	
			string temp = str.substr(i,j-i+1);
			if(temp.size() > 1 && isstr(temp)){
				string a ;
				string b ;
				// cout << temp << endl;
				if(len%2){
					int len = temp.length();
					a = temp.substr(0,len/2+1);
					b = temp.substr(len/2,len/2);
					// cout << temp << "->" << a << " " << b << endl;
					if(a == b){
						// cnt += 1;
						mp[temp] = 1;
					}else{
						// cnt +=1
						mp[temp] = 2;
					}
				}else{
					int len = temp.length();
					a = temp.substr(0,len/2);
					// cout << "A=" << a << endl;
					b = temp.substr(len/2,len/2-1);
					// cout << "B=" << b << endl;
					// cout << temp << "->" << a << " " << b << endl;
					if(a == b) mp[temp] = 1;
					else mp[temp] = 2;
					// ans += mp[str];
				}
				calc(a); 
				calc(b);
			}
		}		
	}
	// return ans;
}
int main(){
	int len;
	cin >> len;
	string str;
	cin >> str;
	// string aa = "aa";
	// cout << aa.substr(1,1) << endl;
	calc(str);
	cout << ans  << endl;
	return 0;
}

#腾讯笔试##腾讯##暑期实习##客户端研发实习生#
全部评论
大佬T4咋做,样例3的C数组怎么构造QAQ
1 回复 分享
发布于 2023-03-26 23:03 广东
第五题路径数量死活9%,我感觉我可能是在计算每个位置的dp时忘记取模了
点赞 回复 分享
发布于 2023-03-26 23:15 广东
第三题的字符串,我想不明白为什么aabaa可以折叠成aba,折叠不是以一个字符或若干个字符为中轴线进行对折,然后抵消字符吗?那aabaa折叠成aba是以什么为中轴线呢?还是说我对题目的理解错了
点赞 回复 分享
发布于 2023-03-27 08:39 广东
大佬,第五题时间复杂度n^3能过吗
点赞 回复 分享
发布于 2023-03-27 11:08 陕西
我去,我在面客户端,但是笔试好像发的后端的题,我们题不一样 逆天
点赞 回复 分享
发布于 2023-03-27 22:23 四川

相关推荐

shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
2 7 评论
分享
牛客网
牛客企业服务