题目描述

将两个整型数组按照升序合并,并且过滤掉重复数组元素。
输出时相邻两数之间没有空格。
请注意本题有多组样例。

感觉解法比较多 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);
}