题目描述
将两个整型数组按照升序合并,并且过滤掉重复数组元素。
输出时相邻两数之间没有空格。
请注意本题有多组样例。
感觉解法比较多 STL直接用
set自动排序+去重
map自动排序,输出first
vector的sort排序,然后unique+erase去重,或者双指针自己写个去重
#include<iostream>
#include<set>
using namespace std;
int main(){
int num1,num2;
int temp;
while(cin>>num1){
set<int> myset;
while(num1--){
cin>>temp;
myset.insert(temp);
}
cin>>num2;
while(num2--){
cin>>temp;
myset.insert(temp);
}
for(auto i:myset)
cout<<i;
cout<<endl;
}
}自己实现排序和去重,就当复习快排和双指针去重吧
#include<iostream>
#include<vector>
#include<stdlib.h>
#include<time.h>
using namespace std;
void quicksort(vector<int>& temp,int left,int right){
if(left>=right) return;
int vip;
srand(time(NULL));
vip=rand()%(right-left+1)+left;
swap(temp[left],temp[vip]);//注意left不要写成0
int v=temp[left];
int le=left,ge=right,i=left+1;
while(i<=ge){//这里不能用for循环,有的不需要i++
if(temp[i]<v){
swap(temp[i],temp[le]);
le++;i++;
}
else if(temp[i]>v){
swap(temp[i],temp[ge]);
ge--;
}
else
i++;
}
quicksort(temp,left,le-1);
quicksort(temp,ge+1,right);
}
int removerepeat(vector<int>& temp){
if(temp.size()==1) return 0;
int low=0,fast=1;//low左边和本身是严格符合已去重的
while(fast<temp.size()){
if(temp[fast]!=temp[low]){
low++;
swap(temp[fast++],temp[low]);
}
else
fast++;
}
return low;
}
int main(){
int num1,num2;
int a;
while(cin>>num1){
vector<int> temp;
while(num1--){
cin>>a;
temp.push_back(a);
}
cin>>num2;
while(num2--){
cin>>a;
temp.push_back(a);
}
quicksort(temp,0,temp.size()-1);//排序完成
int pos=removerepeat(temp);//双指针去重完成
for(int i=0;i<=pos;i++){
cout<<temp[i];
}
cout<<endl;
}
}另一种快排(不适合重复数字多的时候)
int vipvalue(vector<int>& temp,int left,int right){
srand(time(NULL));
int vip=rand()%(right-left+1)+left;
swap(temp[vip],temp[left]);
int lt=left,i=left+1;
while(i<=right){
if(temp[i]<temp[left]){
lt++;
swap(temp[lt],temp[i]);
}
i++;
}
swap(temp[left],temp[lt]);
return lt;//此时lt是轴值本身,lt左边都小于它
}
void quicksort(vector<int>& temp,int left,int right){
if(left>=right) return;
int vip;
vip=vipvalue(temp,left,right);
quicksort(temp,left,vip-1);
quicksort(temp,vip+1,right);
}
京公网安备 11010502036488号