请实现一个函数,功能为合并两个升序数组为一个升序数组
输入的格式是用逗号隔开的数字。
数据范围:输入的字符串长度满足
输入有多个测试用例,每个测试用例有1-2行,每行都是以英文逗号分隔从小到大排列的数字
输出一行以英文逗号分隔从小到大排列的数组
1,5,7,9 2,3,4,6,8,10
1,2,3,4,5,6,7,8,9,10
不允许使用原生的 sort、concat 等函数
#include <iostream> #include <vector> using namespace std; void transform(string str, vector<int>& vec); int main(){ string str1, str2; cin >> str1 >> str2; if(str1.size() == 0){ cout << str2 << endl; return 0; } if(str2.size() == 0){ cout << str1 << endl; return 0; } vector<int> arr1, arr2; transform(str1, arr1); transform(str2, arr2); int i = 0, j = 0; vector<int> res; while(i < arr1.size() && j < arr2.size()){ if(arr1[i] < arr2[j]){ res.push_back(arr1[i]); ++i; }else{ res.push_back(arr2[j]); ++j; } } while(i < arr1.size()){ res.push_back(arr1[i]); ++i; } while(j < arr2.size()){ res.push_back(arr2[j]); ++j; } for(int i = 0; i < res.size() - 1; ++i){ cout << res[i] << ","; } cout << res.back() << endl; return 0; } void transform(string str, vector<int>& vec){ int temp = 0; for(int i = 0; i < str.size(); ++i){ if(str[i] >= '0' && str[i] <= '9'){ temp = temp * 10 + str[i] - '0'; }else{ vec.push_back(temp); temp = 0; } } vec.push_back(temp); }
/* 动态规划。 每次比较当前两个数组中最小的元素,更小的放入答案数组中。 细节处理: 要处理只有一行输入的情况。否则会卡80%,非法访问。 */ import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s1 = in.nextLine(); if (!in.hasNext()) { System.out.println(s1); return; } String s2 = in.nextLine(); String[] str1 = s1.split(","); String[] str2 = s2.split(","); int len1 = str1.length; int len2 = str2.length; int[] arr1 = new int[len1]; int[] arr2 = new int[len2]; for (int i = 0; i < len1; i++) { arr1[i] = Integer.parseInt(str1[i]); } for (int i = 0; i < len2; i++) { arr2[i] = Integer.parseInt(str2[i]); } int[] ans = new int[len1 + len2]; int loc1 = 0; int loc2 = 0; int loc = 0; for (loc = 0; loc < len1 + len2; loc++) { if (loc1 ==len1) { ans[loc] = arr2[loc2]; loc2++; } else if (loc2 == len2) { ans[loc] = arr1[loc1]; loc1++; } else if (arr1[loc1] < arr2[loc2]) { ans[loc] = arr1[loc1]; loc1++; } else { ans[loc] = arr2[loc2]; loc2++; } } for (int i = 0; i < len1 + len2 - 1; i++) { System.out.print(ans[i] + ","); } System.out.println(ans[len1 + len2 - 1]); } }
#include<iostream> #include<vector> #include<string> #include<sstream> using namespace std; void func(vector<int>& nums1,vector<int>& nums2){ int i=0; int j=0; int n1 = nums1.size(); int n2 = nums2.size(); while(i<n1&&j<n2){ if(nums1[i]<=nums2[j]){ cout<<nums1[i++]<<","; }else{ cout<<nums2[j++]<<","; } } while(i<n1){ cout<<nums1[i]; if(i!=n1-1){ cout<<","; } i++; } while(j<n2){ cout<<nums2[j]; if(j!=n2-1){ cout<<","; } j++; } } int main(){ string str1,str2; //这个getline是<string>中的函数,将一行的内容读取到字符串中 getline(cin,str1); getline(cin,str2); if(str2.empty()){//如果只有一行,直接输出即可,不用考虑合并 cout<<str1<<endl; return 0; } vector<int> nums1; vector<int> nums2; //将里面的逗号全部替换成为空格 for(int i=0;i<str1.size();i++){ if(str1[i]==','){ str1[i]=' '; } } for(int i=0;i<str2.size();i++){ if(str2[i]==','){ str2[i]=' '; } } stringstream ss1(str1); int temp; while(ss1>>temp){ nums1.push_back(temp); } stringstream ss2(str2); while(ss2>>temp){ nums2.push_back(temp); } func(nums1,nums2); return 0; }
#include<bits/stdc++.h> using namespace std; int main(){ string str1, str2; cin >> str1 >> str2; vector<int> arr; istringstream ss1(str1); int i; char c; while(ss1 >> i){ arr.push_back(i); if(ss1 >> c ){ continue; } } istringstream ss2(str2); while(ss2 >> i){ arr.push_back(i); if(ss2 >> c ){ continue; } } sort(arr.begin(), arr.end()); cout << arr[0]; for(int i = 1; i < (int)arr.size(); i++){ cout << "," << arr[i]; } return 0; }
import java.util.*; public class Main{ public static void main(String args[]) { Scanner in = new Scanner(System.in); String s1 = in.nextLine(); if (!in.hasNext()) { System.out.println(s1); return; } String s2 = in.nextLine(); String[] ss1 = s1.split(","); String[] ss2 = s2.split(","); int[] a = new int[ss1.length]; int[] b = new int[ss2.length]; for(int i = 0; i < ss1.length; i++) { a[i] = Integer.valueOf(ss1[i]); } for(int i = 0; i < ss2.length; i++) { b[i] = Integer.valueOf(ss2[i]); } int[] res = new Solution().merge(a,b); StringBuilder sb = new StringBuilder(); for(int i = 0; i < res.length; i++) { sb.append(res[i]); if(i < res.length - 1) sb.append(","); } System.out.println(sb.toString()); } } class Solution{ public int[] merge(int[] a, int[] b) { int[] res = new int[a.length + b.length]; int j = 0; for(int i = 0; i < a.length; i++) { res[j] = a[i]; j++; } for(int i = 0; i < b.length; i++) { res[j] = b[i]; j++; } quickSort(res, 0, res.length - 1); return res; } private static void quickSort(int[] a, int left, int right) { int l = left, r = right; if (l < r) { int key = a[left]; while (l < r) { while (l < r && a[r] >= key) r--; if (l < r) a[l++] = a[r]; while (l < r && a[l] < key) l++; if (l < r) a[r--] = a[l]; } a[l] = key; quickSort(a, left + 1, right); quickSort(a, left, right - 1); } } }
#include <iostream> using namespace std; int main(){ //1,5,7,9 string a; string b; vector<int> A; vector<int> B; cin >> a; char div = ','; //分隔符 while(a.find_first_of(div) != string::npos){ int pos = a.find_first_of(div); string str = ""; for(int i = 0; i < pos; ++i){ str += a[i]; } A.push_back(atoi(str.c_str())); a = a.substr(pos + 1); } string str = ""; for(int i = 0; i < a.length(); ++i){ str += a[i]; } A.push_back(atoi(str.c_str())); cin >> b; //因为第二次输入的字符串有可能为空,所以要做下判断 if(b.length()) { while(b.find_first_of(div) != string::npos){ int pos = b.find_first_of(div); string str = ""; for(int i = 0; i < pos; ++i){ str += b[i]; } B.push_back(atoi(str.c_str())); b = b.substr(pos + 1); } str = ""; for(int i = 0; i < b.size(); ++i){ str += b[i]; } B.push_back(atoi(str.c_str())); } //合并 vector<int> merge; int Alen = A.size(); int Blen = B.size(); int i = 0, j = 0; while(i < Alen && j < Blen){ if(A[i] < B[j]){ merge.push_back(A[i]); ++i; } else { merge.push_back(B[j]); ++j; } } while(i < Alen){ merge.push_back(A[i++]); } while(j < Blen){ merge.push_back(B[j++]); } for(int i = 0; i < merge.size(); ++i){ if(i == merge.size() - 1){ cout << merge[i] << endl; return 0; } cout << merge[i] << ','; } return 0; }
#include <bits/stdc++.h> using namespace std; int main(){ int x; char c; string s; cin>>s; stringstream ss1(s); vector<int> a,b,v; while(ss1>>x){ a.push_back(x); if(ss1>>c) continue; } cin>>s; if(cin.peek()==EOF){ for(int i=0;i<a.size();i++){ if(i==a.size()-1) cout<<a[i]<<endl; else cout<<a[i]<<","; } return 0; } stringstream ss2(s); while(ss2>>x){ b.push_back(x); if(ss2>>c) continue; } int n = a.size(), m = b.size(), i=0, j=0; while(i<n&& j<m){ if(a[i]<b[j]) v.push_back(a[i++]); else if(a[i]>b[j]) v.push_back(b[j++]); } while(i<n) v.push_back(a[i++]); while(j<m) v.push_back(b[j++]); for(int i=0;i<v.size();i++){ if(i==v.size()-1) cout<<v[i]<<endl; else cout<<v[i]<<","; } return 0; }
#include <bits/stdc++.h> using namespace std; int main(){ int num; vector<int> arr1,arr2; do{ cin>>num; arr1.push_back(num); } while(cin.get()!='\n');//80%卡在这里!!!要处理只有一行输入用cin.peek()判断是不是输入结尾;if(cin.peek()==EOF){ for(int i:arr1){ cout<<i; if(i!=arr1.back()) cout<<','; } return 0; } do{ cin>>num; arr2.push_back(num); } while(cin.get()!='\n'); int i=0,j=0; while(i!=arr1.size()&&j!=arr2.size()){ if(arr1[i]<=arr2[j]) cout<<arr1[i++]; else cout<<arr2[j++]; if(i!=arr1.size()||j!=arr2.size()) cout<<','; } while(j!=arr2.size()){ cout<<arr2[j++]; if(j!=arr2.size()) cout<<','; } while(i!=arr1.size()){ cout<<arr1[i++]; if(i!=arr1.size()) cout<<','; } }
import sys a=list(map(int,sys.stdin.readline().split(','))) try: b=list(map(int,sys.stdin.readline().split(','))) res=[] l,r=0,0 while l<len(a) and r<len(b): if a[l]<b[r]: res.append(a[l]) l+=1 else: res.append(b[r]) r+=1 if r<len(b): res.extend(b[r:]) else: res.extend(a[l:]) res=list(map(str,res)) print(','.join(res)) except: a=list(map(str,a)) print(','.join(a))
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str1 = scanner.next(); if (!scanner.hasNext()) { System.out.println(str1); return; } int[] num1 = strToIntArr(str1); int[] num2 = strToIntArr(scanner.next()); int[] num = new int[num1.length + num2.length]; int index1 = 0, index2 = 0, index = 0; while (index1 < num1.length && index2 < num2.length) { num[index++] = (num1[index1] <= num2[index2]) ? num1[index1++] : num2[index2++]; } while (index1 < num1.length) { num[index++] = num1[index1++]; } while (index2 < num2.length) { num[index++] = num2[index2++]; } for (int i = 0; i < num.length; i++) { if (i == num.length - 1) { System.out.println(num[i]); } else { System.out.print(num[i] + ","); } } } public static int[] strToIntArr(String str) { String[] strNumber = str.split(","); int[] number = new int[strNumber.length]; for (int i = 0; i < strNumber.length; i++) { number[i] = Integer.parseInt(strNumber[i]); } return number; } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); String line1 = bf.readLine(); String line2 = bf.readLine(); //注意题目的输入为1-2行 if (line2 == null){ System.out.println(line1); return; } String[] strs1 = line1.split(","); String[] strs2 = line2.split(","); StringBuilder sb = new StringBuilder(); //定义两个指针,每次添加较小的元素,并移动相应的指针,直到有一个指针到头了,把剩下的元素全部添加即可。 int p1 = 0, p2 = 0; while (p1 < strs1.length && p2 < strs2.length) { if (Integer.parseInt(strs1[p1]) < Integer.parseInt(strs2[p2])) { sb.append(strs1[p1++]); } else { sb.append(strs2[p2++]); } sb.append(","); } while (p1 < strs1.length){ sb.append(strs1[p1++]).append(","); } while (p2 < strs2.length){ sb.append(strs2[p2++]).append(","); } System.out.println(sb.substring(0,sb.length()-1).toString()); } }
class MainActivity: def main(self): # Read the data nums1 = list(map(int, filter(lambda x: len(x) > 0, input().split(',')))) try: nums2 = list(map(int, filter(lambda x: len(x) > 0, input().split(',')))) except: nums2 = [] # Initialization results = [] ptr1 = 0 ptr2 = 0 # Traverse while ptr1 < len(nums1) and ptr2 < len(nums2): if nums1[ptr1] < nums2[ptr2]: results.append(nums1[ptr1]) ptr1 += 1 else: results.append(nums2[ptr2]) ptr2 += 1 if ptr1 < len(nums1): results += nums1[ptr1:] elif ptr2 < len(nums2): results += nums2[ptr2:] print(','.join(map(str, results))) if __name__ == '__main__': M = MainActivity() M.main()
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); //只有一行的话直接return String str = in.nextLine(); String str1[] = str.split(","); try { //第二行可能不存在 String str2[] = in.nextLine().split(","); int[] arr1 = new int[str1.length]; int[] arr2 = new int[str2.length]; for (int i = 0 ; i < str1.length; i++) { arr1[i] = Integer.parseInt(str1[i]); } for (int i = 0; i < str2.length; i++) { arr2[i] = Integer.parseInt(str2[i]); } int[] arr3 = merge(arr1, arr2); for (int i = 0; i < arr3.length - 1; i++) { System.out.print(arr3[i] + ","); } System.out.print(arr3[arr3.length - 1]); } catch (Exception e) { System.out.print(str); } } public static int[] merge(int[] arr1, int[] arr2) { int len1 = arr1.length; int len2 = arr2.length; int[] res = new int[len1 + len2]; //arr1的指针 int i = 0; //arr2的指针 int j = 0; //放res的指针 int z = 0; //放较小的值 int tem = 0; while (i < len1 && j < len2) { if (arr1[i] < arr2[j]) { tem = arr1[i++]; } else { tem = arr2[j++]; } res[z++] = tem; } while (i < len1) { res[z++] = arr1[i++]; } while (j < len2) { res[z++] = arr2[j++]; } return res; } }
package main import ( "fmt" "os" "bufio" "strings" "strconv" ) var in=bufio.NewReader(os.Stdin) func main() { s1,_:=in.ReadString('\n') s2,ok:=in.ReadString('\n') if ok!=nil{ fmt.Print(s1[:len(s1)-1]) return } s1=s1[:len(s1)-1] s2=s2[:len(s2)-1] arr1:=strings.Split(s1,",") arr2:=strings.Split(s2,",") arr:=[]int{} for _,s:=range append(arr1,arr2...){ x,_:=strconv.Atoi(s) arr=append(arr,x) } for i:=0;i<len(arr);i++{ min:=i for j:=i+1;j<len(arr);j++{ if arr[j]<arr[min]{ min=j } } if min!=i{ arr[min],arr[i]=arr[i],arr[min] } } for i,x:=range arr{ fmt.Printf("%v",x) if i<len(arr)-1{ fmt.Print(",") } } }
#include <stdio.h> #include <stdlib.h> #include <string.h> // [计] 分界符 const char* const DELIMITER = ","; // ====================== function definition ====================== void printNumbers(int nums[], const int numsSize) { int i; for (i = 0; i < numsSize; ++i) { printf("%d", *(nums + i)); if (i < numsSize - 1) putchar(','); } putchar('\n'); } // conversion function void readNumbers(const char* str, int* nums, int* size) { char* tok = strtok(str, DELIMITER); while (tok) { *(nums + (*size)++) = atoi(tok); tok = strtok(NULL, DELIMITER); } } void merge(int nums1[], int nums1Size, int nums2[], int nums2Size, int merged[]) { int i = 0, j = 0, k = 0; while (i < nums1Size && j < nums2Size) merged[k++] = nums1[i] < nums2[j] ? nums1[i++] : nums2[j++]; while (i < nums1Size) merged[k++] = nums1[i++]; while (j < nums2Size) merged[k++] = nums2[j++]; } // ====================== function definition ====================== int main(const int argc, const char** argv) { char str1[2000], str2[2000]; int nums1[500], nums2[500], nums1Size, nums2Size; // handle input while (scanf("%s%s", str1, str2) != EOF) { nums1Size = nums2Size = 0; readNumbers(str1, nums1, &nums1Size); readNumbers(str2, nums2, &nums2Size); int merged[nums1Size + nums2Size]; merge(nums1, nums1Size, nums2, nums2Size, merged); printNumbers(merged, nums1Size + nums2Size); } return 0; }
Scanner scanner = new Scanner(System.in); String a = scanner.nextLine(); if (!scanner.hasNextLine()) { System.out.println(a); scanner.close(); return; } String[] nums1List = a.split(","); String[] nums2List = scanner.nextLine().split(","); scanner.close();我写合并的时间不到10分钟,为了这几行代码花了20分钟,突然要在牛客上面试,这个好别扭啊,感觉面试凉了。
#include <bits/stdc++.h> using namespace std; int main() { vector<int> number; while(1) { int t; cin>>t; number.push_back(t); if(getchar()=='\n') { break; } } int t; while(cin>>t) { number.push_back(t); if(getchar()=='\n') { break; } } for(int i=0;i<number.size();i++) { for(int j=i+1;j<number.size();j++) { if(number[i]>number[j]) { int tmp=number[i]; number[i]=number[j]; number[j]=tmp; } } } for(int i=0;i<number.size();i++) { if(i<=number.size()-2) cout<<number[i]<<","; else cout<<number[i]; } return 0; }弄到一个vector中,冒泡排序
#include<iostream> (720)#include<vector> #include<string> (765)#include<algorithm> using namespace std; void Push(vector<int>& a,string s){ int temp=0; for(int i=0;i<s.size();++i){ if(s[i]==',') { a.push_back(temp); temp=0;} else{ temp*=10; temp+=(s[i]-'0'); } } a.push_back(temp); } void PushToStr(string& result,int a){ string res; if(a==0) res+='0'; while(a){ int temp=a%10; a/=10; res+=(temp+'0'); } reverse(res.begin(),res.end()); result+=res; } int main(){ string str1,str2; getline(cin,str1); getline(cin,str2); vector<int> a; vector<int> b; if(str1.size()>0) Push(a,str1); if(str2.size()>0) Push(b,str2); int index1=0,index2=0; string result; while(index1<a.size()&&index2<b.size()){ if(a[index1]<=b[index2]){ PushToStr(result,a[index1]); index1++; } else{ PushToStr(result,b[index2]); index2++; } result+=','; } while(index1<a.size()){ PushToStr(result,a[index1++]); result+=','; } while(index2<b.size()){ PushToStr(result,b[index2++]); result+=','; } result.pop_back(); cout<<result<<endl; }
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String tmp1 = sc.nextLine(); if(!sc.hasNextLine()){ System.out.print(tmp1); return; } String tmp2 = sc.nextLine(); String[] s1 = tmp1.split(","); String[] s2 = tmp2.split(","); int[] nums1 = new int[s1.length]; int[] nums2 = new int[s2.length]; for(int i=0; i<s1.length; i++){ nums1[i] = Integer.parseInt(s1[i]); } for(int i=0; i<s2.length; i++){ nums2[i] = Integer.parseInt(s2[i]); } int[] res = new int[s1.length+s2.length]; int p1 = 0, p2 = 0, index = 0; while(p1!=nums1.length || p2!=nums2.length){ if(p1 == nums1.length){ res[index] = nums2[p2]; p2++; } else if(p2 == nums2.length){ res[index] = nums1[p1]; p1++; } else{ if(nums1[p1]>=nums2[p2]){ res[index] = nums2[p2]; p2++; } else{ res[index] = nums1[p1]; p1++; } } index++; } for(int i=0 ; i<res.length; i++){ System.out.print(res[i]); if(i!=res.length-1) System.out.print(","); } } }