美团算法岗笔试的编程题??
-------------------------------------------------------------------------------------------------
更新第一题的代码,楼主凭回忆写的,不保证对!!!
-------------------------------------------------------------------------------------------------
bool cmp(string s1, string s2){
int i=0, j=0;
while(i<s1.size() && j<s2.size()){
if(s1[i] > s2[j]) return true;
else if(s1[i] < s2[j]) return false;
++i; ++j;
}
if(i==s1.size()) return true;
return false;
}
void merge(vector<string> &nums, vector<string> &aux, int start, int mid, int end){
int i = start, j = mid + 1, k = start;
while (i <= mid && j <= end){ // 两边都还没结束
if (cmp(nums[i], nums[j])) aux[k++] = nums[i++];
else aux[k++] = nums[j++];
}
while(j <= end) aux[k++] = nums[j++]; // 左半边结束了
while(i <= mid) aux[k++] = nums[i++]; // 右半边结束了
for (int i = start; i <= end; i++)
nums[i] = aux[i];
}
void Divide(vector<string> &nums, vector<string> &aux, int start, int end) {
if (start >= end) return;
int mid = (start + end) / 2;
Divide(nums, aux, start, mid);
Divide(nums, aux, mid + 1, end);
merge(nums, aux, start, mid, end);
}
int main(){
string s; cin>>s;
string tmp="";
istringstream in(s);
vector<string> nums;
while(getline(in, tmp, ',')) nums.push_back(tmp);
vector<string> aux(nums.size(), "");
Divide(nums, aux, 0, nums.size()-1);
for(int i=0; i<nums.size(); ++i){
if(i==0) cout<<nums[i];
else{
cout<<","<<nums[i];
}
}
return 0;
} -------------------------------------------------------------------------------------------------
分割线
-------------------------------------------------------------------------------------------------
怎么说呢,感觉编程题没啥难度嘛。。两道都挺简单的靠暴力就能过去了。。。早知道多花点时间把选择题做好了😂😂😂
第一题:字符串排序(ac)
这没啥好说的,既然题目要求不能用sort函数,就自己写一遍归并排序好了,不过同时把比较器改一下;
代码忘保存了,不过就是归并排序的模板也没啥必要贴了。。
第二题:求两两字符串的公共前缀长度(ac)
大意是给你一个数组arr,每个元素是一个string,然后给你很多两个一组的索引x,y求arr[x]和arr[y]的最长公共前缀长度。
最原始的暴力解法即可ac。。。
int main() {
int n; cin>>n;
vector<string> arr(n, "");
for(int i=0; i<n; ++i){
cin >> arr[i];
}
int x,y;
while(cin>>x>>y){
--x;--y;
if(x>=0 && x<=n-1 && y>=0 && y<=n-1){
string s1=arr[x], s2=arr[y];
int i=0, j=0, cnt=0;
while(i<s1.size() && j<s2.size() && s1[i] == s2[j]){
++cnt;
++i;++j;
}
cout<<cnt<<endl;
}
}
return 0;
} 
查看1道真题和解析
