题目难度:一星
考察点:合并两个有序数组

方法:合并两个有序数组

1. 分析:

题目的意思就是给定两个有序数组,然后将这两个有序数组进行排序,然后输出,但是不能使用c++内部自定义的sort函数等等。其实这个跟归并排序的想法是差不多的,首先我们假设两个有序数组a和b,长度分别为n和m,那么我们可以创建一个新的数组ans用来保存排序之后的数组,那么我们具体的想法就是定义两个指针i=0和j=0,i指针代表遍历的是a数组,j指针代表遍历的是b数组,然后我们比较a[j]和b[j],然后把小的那个放在ans数组种。具体表现形式为:
if(a[i] < b[j]) ans[k++] = a[i++];
else ans[k++] = b[j++];
然后当某一个数组比完之后,直接把另外一个数组的值赋给ans即可。
举个例子:
a数组为[1, 4]
b数组为[2, 3]
第一步:a[0]和b[0]比,那么显然a[0]小,所以ans[0] = a[0] = 1;
第二步:a[1]和b[0]比,那么显然b[0]小,所以ans[1] = b[0] = 2;
第三步:a[1]和b[1]比,那么显然b[1]小,所以ans[2] = a[1] = 3;
第四步:剩下一个a[1],直接赋值,所以ans[3] = a[1] = 4;
所以排序之后的数组为ans=[1, 2, 3, 4]
tips:
(1). 这个题的输入是比较恶心的,首先要处理一下输入,将字符串转化为数组,在这里我采用vector实现。
(2). 还有一个坑点就是如果这两个字符串其中有一个是空串的话,直接输出另外一个字符串即可,没有必要去转化为数组。

算法实现:
(1). 首先输入两个字符串。
(2). 写一个将字符串转化为vector的函数,在代码中叫做get_array,返回值为vector。
(3). 得到两个数组a和b,之后按照上述的方法进行比较排序。
(4). 输出两个数组排序之后的结果。

2. 复杂度分析:

时间复杂度:O(n+m)
空间复杂度:O(n+m)


3. 代码:

#include <bits/stdc++.h>
using namespace std;
vector<int> get_array(string s) {
 vector<int> ans;
 int num = 0;
 for(int i=0; i<s.size(); i++) {
     if(s[i] == ',') {
         ans.push_back(num);
         num = 0;
     }
     else num = num*10+s[i]-'0';
 }
 ans.push_back(num);
 return ans;
}
int main() {
 string s1, s2; cin>>s1>>s2;
 if(s1 == "") {
     cout<<s2<<endl;
     return 0;
 }
 if(s2 == "") {
     cout<<s1<<endl;
     return 0;
 }
 vector<int> a = get_array(s1);
 vector<int> b = get_array(s2);
 vector<int> ans;
 int i = 0, j = 0;
 while(i<a.size() && j<b.size()) {
     if(a[i] < b[j]) ans.push_back(a[i++]);
     else ans.push_back(b[j++]);
 }
 while(i < a.size()) ans.push_back(a[i++]);
 while(j < b.size()) ans.push_back(b[j++]);
 for(int i=0; i<ans.size(); i++) {
     if(i == ans.size()-1) cout<<ans[i];
     else cout<<ans[i]<<",";
 }
 return 0;
}