携程 无线前端方向 3题全AC
表示携程的笔试估计可能通过 review 代码 刷人
结束后上代码
第一题 最长公共子串
注意题目说的是不区分大小写
int longestSubStrLength(string s1, string s2) {
int len1 = s1.size(), len2 = s2.size(), iMax = 0;
vector<vector<int>> dp(len1+1, vector<int>(len2+1, 0));
for(int i=1; i<=len1; i++)
for(int j=1; j<=len2; j++)
// 通过 | ‘ ’ 把字符都转成小写
if((s1[i-1]|' ') == (s2[j-1]|' ')) {
dp[i][j] = dp[i-1][j-1] + 1;
iMax = max(iMax, dp[i][j]);
}
return iMax;
}第二题 版本号比较
vector<int> getNum(string& a) {
vector<int> res;
int ind = -1, len = a.size(), num = 0;
while(++ind < len) {
if(a[ind] == '.') res.push_back(num), num = 0;
else num = num * 10 + a[ind]-'0';
}
// 最后还需要再加一个
res.push_back(num);
return res;
}
bool getRes(vector<int>& arr, vector<int>& brr) {
int len1 = arr.size(), len2 = brr.size(), ind = -1;
while(++ind < min(len1, len2)) {
if(arr[ind] < brr[ind]) return true;
if(arr[ind] > brr[ind]) return false;
}
return len1 <= len2;
}
string sortVersion(string s1, string s2) {
vector<int> arr = getNum(s1);
vector<int> brr = getNum(s2);
bool flag = getRes(arr, brr);
string res = flag ? s1 + "," + s2 : s2 + "," + s1;
return res;
}第三题 乘积最大子序列
#include <iostream>
#include <vector>
using namespace std;
vector<int> getNum(string& a) {
vector<int> res;
int ind = -1, len = a.size(), num = 0;
bool flag = true;
while(++ind < len) {
if(a[ind] == '-') flag = false;
else if(a[ind] == ' ')
res.push_back(flag ? num : -num), flag = true, num = 0;
else num = num * 10 + a[ind]-'0';
}
// 最后这个也要判断符号
res.push_back(flag ? num : -num);
return res;
}
int main() {
string s;
getline(cin, s);
vector<int> arr = getNum(s);
int iMax = arr[0], iMin = arr[0], res = arr[0];
for(int i=1; i<arr.size(); i++) {
if(arr[i] >= 0) {
iMax = max(iMax * arr[i], arr[i]);
iMin = min(iMin * arr[i], arr[i]);
}else {
int tem = iMax;
iMax = max(iMin * arr[i], arr[i]);
iMin = min(tem * arr[i], arr[i]);
}
res = max(res, iMax);
}
cout << res << endl;
return 0;
}
#携程##笔试题目#