今晚携程笔试,编程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的大神麻烦贴一下代码吧。