2019腾讯实习笔试题部分记录

匿名 (未验证) 提交于 2019-12-02 23:26:52
版权声明:本文为博主原创文章,转载请注明出处。https://blog.csdn.net/u013000248 https://blog.csdn.net/u013000248/article/details/88643562

第一题:有n层的一座塔,跳塔

有n层的一座塔,每层高度不一样,现在小Q去爬塔,有如下特性:他爬塔的速度恒定,也就是说爬每一层的用时和这一层的高度成正比。但是他有一个能力:他可以有一种魔法,这个魔法可以跳过一层或者两层塔,但是每跳跃一次,都要停下来爬至少一层才能继续跳跃。需要你规划出一条方案,让他能够最短的时间爬到塔顶(最后如果跳跃,可以选择越过塔顶,也就是说如果最后倒数第二层是走完的,直接跳到顶就完事了)
输入:两行数据,第一行:塔层数;第二行,每层高度,用空格隔开。如:
4
2 5 2 6
输出:总计用时
思路:最优路径问题一直是个难题,拿到题的第一反应就是用递归或者Huffman树的思路求解。贪心法是不合适的,因为贪心法不能保证最优解。想到了一种暴力测试的方法:根据每层的顺序构造二叉树,每层都可以选择跳或者不跳,分别对应左右子树。最终得到层数为n的满二叉树。从顶到底的搜索过程对应着一条路径,这个满二叉树不是所有分支都是合题意的,所以根据规则:连续跳跃的层数不得超过2,也就是连续两层的跳跃可以看做一次跳跃。这样就可以砍掉一些分支。然后遍历一遍从根节点到叶子结点,每次遍历都是一个方案路径的实现,这样就穷举出来了所有的可能方案,遍历过程计算“爬”的长度。
PS:第一阶段构造树、第二阶段砍掉不必要分支、第三阶段遍历计算、最后查找最小值。后续可以把构造树和砍掉分支的操作合并到一起去,可以提高算法运行效率。

第二题:没看懂题,就是黑白格数格子,忘了

第三题:约瑟夫环

小Q有n张牌,分别是1~n;现在要把第一张牌放到最底下然后再把顶层的牌拿开,直到只剩一张。求拿开牌的顺序。
(我基本没做过什么笔试面试题,凑巧我知道这个题)

int main(int argc, _TCHAR* argv[]) { 	int num  = 0; 	cin >> num; 	queue<int> q; 	vector<int> out; 	for (int i = 0; i < num; i++) { 		q.push(i+1); 	} 	while (q.size() > 1) { 		out.push_back(q.front()); 		q.pop(); 		if (q.size() != 1)  		{ 			q.push(q.front()); 			q.pop(); 		} else { 			break; 		} 		 	} 	out.push_back(q.front()); 	for (int i = 0; i < out.size(); i++) { 		printf("%d ", out[i]); 	} 	return 0; } 

第三题:2019年3月19日08:56:15干活了,题目描述以后再写,看下面就知道要做什么了

void answer(vector<vector<int>> vec, int num_i, int min_, int& ans, int& idx) { 	ans = min_; 	for (int i = 0; i < num_i; i++) { 		for (int j = 0; j < num_i; j++) { 			if (vec[i][j] < ans && vec[i][j] >= 0) { 				ans = vec[i][j]; 				idx = i; 			} 		} 	} } int main() { 	int n; 	double num; 	vector<vector<int>> vec; 	cin >> n; 	vector<int> nums; 	for (int i = 0; i < n; i++) { 		double num; 		cin >> num; 		nums.push_back(num); 	} 	for (int i = 0; i < n; i++) { 		vector<int> sub; 		for (int j = 0; j < n; j++) { 			sub.push_back(-1); 		} 		vec.push_back(sub); 	}  	for (int i = 0; i < vec.size(); i++) { 		for (int j = i+1; j < n; j++) { 			vec[i][j] = abs(nums[i] - nums[j]); 		} 	}  	int min_ = -1; 	for (int i = 0; i < n; i++) { 		if (nums[i] > min_) 			min_ = nums[i]; 	} 	 	for (int i = 2; i <= n; i++) { 		int ans; 		int  idx; 		answer(vec, i, min_, ans, idx); 		printf("%d %d\n", ans, nums[idx]); 	} 	return 0; } 
文章来源: https://blog.csdn.net/u013000248/article/details/88643562
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!