今晚携程笔试,编程AC两道,附代码。

今天携程的编程题有点简单了,虽然AC两道,但不知道能不能有面试机会 .....

第一题:
股票最大利润。附leetcode原题链接 https://leetcode.com/problems/best-time-to-buy-and-sell-stock/
AC代码:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <sstream>
int maxProfit(vector<int>& prices) {
	int n = prices.size();
	if (n == 0) return 0;
	int maxPro = 0;
	int minPri = prices[0];
	for (int i = 1; i < n; i++)
	{
		minPri = min(minPri, prices[i]);
		maxPro = max(maxPro, prices[i] - minPri);
	}
	return maxPro;
}
int main() {
	string str;
	while (getline(cin,str))
	{
		vector<int> vec;
		string s;
		for (int i = 0; i < str.length(); i++) {
			if (str[i] >= '0' && str[i] <= '9') {
				//vec.push_back(int(str[i] - '0'));
				s = s + str[i];
			}
			else{
				stringstream ss;
				ss << s;
				int n;
				ss >> n;
				vec.push_back(n);
				s = "";
			}
		}
		stringstream ss;
		ss << s;
		int n;
		ss >> n;
		vec.push_back(n);
		cout << maxProfit(vec) << "\n";
	}
	return 0;
}
通过率是67%的童鞋是只考虑了股价为个位数的情况吧,我开始也是。

第二题:二分查找
AC代码:
#include <iostream>
#include <vector>
using namespace std;
//从数组vec中找出num,返回位置下标
int findNum(vector<int> &vec, int num,int left,int right) {
	int start = left;
	int end = right;
	while (start < end) {
		int mid = start + (end - start) / 2;
		if (vec[mid] < num) {
			start = mid + 1;
		}
		if (vec[mid] > num) {
			end = mid - 1;
		}
		if (vec[mid] == num)
			return mid;
	}
        //没找到这个数,那就顺序遍历得出这个数应该插入的位置
	int index = -1;
	int i = 0;
	while (i < vec.size()) {
		if (vec[i] > num)
			break;
		i++;
	}
	return index - i;
}
int main() {
	int x, n;
	while (cin >> x) {
		cin >> n;
		vector<int> vec(n, 0);
		for (int i = 0; i < n; i++) {
			cin >> vec[i];
		}
		cout << findNum(vec, x, 0, n - 1) << "\n";
	}
	return 0;
}
以上是试卷第三部分的两道编程题,我本来以为编程题只有这两道,我全AC了,一阵窃喜,结果第四部分点开一看还是一道编程题......有必要么,直接全放第三部分不就行了..
题目大意是求n个节点的无向图的单源最短路径的长度,并且路径要经过这n节点。
这道题因为时间关系没做出来,AC的大神麻烦贴一下代码吧。

全部评论
附加题用全排列暴力做出来了。。。 void Swap(int &a, int &b) { int temp = a; a = b; b = temp; } void Permutation(vector<int> &vec, int start, int end, vector<vector<int>> &vecBig) { if(start == end) { vecBig.push_back(vec); } else { for(int i = start; i<= end; ++i) { Swap(vec[i], vec[start]); Permutation(vec, start+1, end, vecBig); Swap(vec[i], vec[start]); } } } int main() { int n; cin>>n; vector<vector<int>> vecBig; for(int i = 0; i<=n; ++i) { vector<int> vecTemp; string str; getline(cin, str); for(int j = 0; j< str.size(); ++j) { if(str[j] == ',') str[j] = ' '; } istringstream ss(str); int num; while(ss>>num) { vecTemp.push_back(num); } if(i!= 0) { vecBig.push_back(vecTemp); } } vector<int> vect; for(int i = 0; i< n; ++i) { vect.push_back(i); } vector<vector<int>> vec; Permutation(vect, 0, n-1, vec); int min = 99999; for(int i = 0; i< vec.size(); ++i) { int curMid = 0; vector<int> vect = vec[i]; int pre = vect[0]; for(int j = 1; j<vect.size(); ++j) { int cur = vect[j]; curMid +=vecBig[pre][cur]; pre = cur; } if(curMid<min) min = curMid; } cout<<min<<endl; }
点赞 回复 分享
发布于 2016-09-18 10:09
最后一道题是华为CodeCraft大赛的原题啊,没有那么容易吧。
点赞 回复 分享
发布于 2016-09-17 21:45
楼主,while (start < end) 这个地方应该是<= 把
点赞 回复 分享
发布于 2016-09-17 21:53
是啊,本以为最后一部分是简答,所以前面没着急,后来发现特么的又是编程,最后一题应该是深度优先遍历图,
点赞 回复 分享
发布于 2016-09-18 00:10
ac了三道 但是选择题我都不会
点赞 回复 分享
发布于 2016-09-18 08:11
最后一题TSP
点赞 回复 分享
发布于 2016-09-18 11:10

相关推荐

11-01 08:48
门头沟学院 C++
伤心的候选人在吵架:佬你不要的,能不能拿户口本证明过户给我。。球球了
点赞 评论 收藏
分享
评论
点赞
12
分享
牛客网
牛客企业服务