腾讯10.16客户端笔试

半个多月没刷题,完全没手感,菜的不行。
虽然知道没戏,还是做了一下,应该是秋招的最后一场笔试了,记录一下吧。
1.  tecent no.1  90%    两个链表异或操作
#if 0
/**
* struct ListNode {
*	int val;
*	struct ListNode *next;
*	ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
	ListNode* xorList(ListNode* a, ListNode* b) {
		// write code here
		int len_a = 0;
		int len_b = 0;
		ListNode* heada = a;
		ListNode* headb = b;
		string sa = "";
		string sb = "";
		while (heada) {
			if (heada) {
				sa += to_string(heada->val);
			}
			heada = heada->next;
			len_a++;

		}
		//         cout<<len_a<<endl;
		//         cout<<sa<<endl;
		while (headb) {
			if (headb) {
				sb += to_string(headb->val);
			}
			headb = headb->next;
			len_b++;

		}
		//         cout<<len_b<<endl;
		//         cout<<sb<<endl;
		reverse(sb.begin(), sb.end());
		int diff;
		if (len_a >= len_b) {
			diff = len_a - len_b;
			for (int i = 0; i < diff; i++) {
				sb.insert(sb.begin(), '0');
			}
		}
		else {
			diff = len_b - len_a;
			for (int i = 0; i < diff; i++) {
				sa.insert(sa.begin(), '0');
			}
		}
		string res = "";
		for (int i = 0; i < max(len_a, len_b); i++) {
			if (sa[i] == sb[i]) {
				res += '0';
			}
			else {
				res += '1';
			}
		}
		int index = 0;
		while (res[index] == '0') {
			index++;
		}
		string ret(res.begin() + index, res.end());
		cout << ret << endl;
		ListNode* head_ret = new ListNode(-1);
		ListNode* dummy = head_ret;
		for (int i = 0; i < ret.size(); i++) {
			int val = ret[i] - '0';
			ListNode* node = new ListNode(val);
			dummy->next = node;
			dummy = dummy->next;
		}

		return head_ret->next;
	}

};

#endif

2. tecent no.2  回溯暴力 33.33%   操作k次数组,取某个数的二级制中的1的个数,将其赋值给那个数,操作n次后,数组的最小和
只想到了暴力解法,然而case通过率感人。  求助大佬们给个最优解
#if 0
#include<iostream>
#include<vector>
#include<bitset>
#include<limits.h>

using namespace std;

int res = INT_MAX;

int qiuhe(vector<int>& nums) {
	int res = 0;
	for (int val : nums)
		res += val;
	return res;
}

void tranverse(vector<int>& nums, int index, int k) {
	if (index == k) {
		int he = qiuhe(nums);
		res = min(res, he);
		return;
	}
	for (int i = 0; i < nums.size(); i++) {
		bitset<32> val(nums[i]);
		int ori = nums[i];
		int cnt = val.count();
		nums[i] = cnt;
		tranverse(nums, index + 1, k);
		nums[i] = ori;
	}
}

int main() {
	int n, k;
	cin >> n >> k;
	vector<int> nums(n, 0);
	for (int i = 0; i < n; i++) {
		int val;
		cin >> val;
		nums[i] = val;
	}
	tranverse(nums, 0, k);
	cout << res;
}
#endif

3. tecent no.3  输出-1 16.67%   题目好像是,某商品有两种,一个是打折的一个是没有打折的,有不同的价格和幸福度,并且打折和不打折商品只能选择一个,求用指定的金钱购买商品,使得幸福度最高,不能刚好花完钱则输出-1.

应该是背包问题,用动态规划解决,之前做过类似的题目,可惜晚上做题大脑短路,不想思考,直接输出-1骗了点分。

#include<iostream>
#include<vector>
#include<bitset>
#include<limits.h>

using namespace std;

int main() {
	int n, x;
	cin >> n >> x;
	vector<int> x1(n, 0);
	vector<int> w1(n, 0);
	vector<int> x2(n, 0);
	vector<int> w2(n, 0);
	for (int i = 0; i < n; i++) {
		int a, b, c, d;
		cin >> a >> b >> c >> d;
		x1[i] = a;
		w1[i] = b;
		x2[i] = c;
		w2[i] = d;
	}


	cout << -1;
}

#endif

3. tecent no. 4   deque模拟 100%   模拟问题  比较简单,直接 ac
#if 1
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<deque>
using namespace std;

int main() {
	int n;
	cin >> n;
	deque<int> arr(n, 0);
	for (int i = 0; i < n; i++) {
		int val;
		cin >> val;
		arr[i] = val;
	}
	vector<int> shunxu;
	int front;
	int back;
	for (int i = 0; i < n; i++) {
		front = arr.front();
		back = arr.back();
		if ((i + 1) % 2 == 1) {
			if (front > back) {
				shunxu.push_back(front);
				arr.pop_front();
			}
			else {
				shunxu.push_back(back);
				arr.pop_back();
			}
		}
		else {
			if (front < back) {
				shunxu.push_back(front);
				arr.pop_front();
			}
			else {
				shunxu.push_back(back);
				arr.pop_back();
			}
		}
	}
	int len = shunxu.size() - 1;
	for (int i = 0; i < len; i++) {
		cout << shunxu[i] << " ";
	}
	cout << shunxu[len];
	return 0;
}
#endif

5.  tecent no.5    随便输出n, 骗了18.18%  好像左右脚 什么的,忘记题目了,

最后剩了了些时间本来想把动规那道题做做的,想了想鹅的hc, 哎,自己这么菜,算了吧,

笔试应该寄了,纪念秋招最后一场笔试吧,虽然没做好。

----------------------------------------------------------------------
最后祈祷一波,
希望下周百度有消息~
祝自己好运。

#腾讯笔试#
全部评论
我觉得还是要刷题的
点赞 回复 分享
发布于 2022-10-17 13:17 山西
1. 反转b链表再异或,最后全零要返回一个零;2. 最大堆;3. 双指针;4. dfs; 5. dp+前缀和
点赞 回复 分享
发布于 2022-10-17 13:41 广东
第一题反转链表加计数,第二题记录每个数字“本身与自身1的个数的差值”,然后sort一下减去前k位就a97,第三题没那么复杂,轮流减去大的小的就100了后两题题目不一样了
点赞 回复 分享
发布于 2022-10-18 08:27 安徽
解析 最终100%+100%+100%+100%+72.73%,难度中等,需要考虑的细节较多。 1. 直接把链表转为字符串进行处理,然后把结果再转为链表。多试几次运气好能AC. 2. 哈希+打表。因为a_i <= 10^9 < 2^100,出现的任何数字的二进制都不会超过100个1,故将不超过100的正整数以及所有a_i的转换增益进行从大到小的排序。对输入数组a[]哈希,然后找增益尽量大的数进行操作,操作k次后即得到答案。用堆可以进一步优化时间,但没必要。 3. 因为商品数量n<=12,可以直接DFS. 每种商品有3种情况:原价买、打折买和不买,故解空间不超过3^12,再加上剪枝,时间完全够用。 4. 写得很花哨,其实很多障眼法。奇数轮弹出较小数,偶数轮弹出较大数即可AC. 5. 动归,但是超时间。只能算出n<=1000的情况。牛客能搜到AC的解答,将O(n^2)优化到了O(n).
点赞 回复 分享
发布于 2022-10-23 18:10 上海

相关推荐

Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
1 4 评论
分享
牛客网
牛客企业服务