题目描述

输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
保证输入的整数最后一位不是0。

方法1:

哈希表存储数字是否出现过的状态

#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
int main(){
    int num;
    cin>>num;
    unordered_map<int,bool> hashtable;
    int sum=0,a;//a保存每次的末尾数字
    while(num!=0){
        int a=num%10;
        if(!hashtable[a]){
            hashtable[a]=true;
            sum=sum*10+a;//重点 适用于从数字最大位开始出现的情况
        }
        num/=10;
    }
    cout<<sum;
}

方法2:

与上述大同小异,换用集合set存储,因为集合属性是不允许重复出现,所以数量只可能是0或1,用count函数,1时表示已经出现过.(set比map速度快点)

#include<iostream>
#include<set>
using namespace std;
int main(){
    int num;
    cin>>num;
    set<int> myset;
    int sum=0,a;//a保存每次的末尾数字
    while(num!=0){
        int a=num%10;
        if(!myset.count(a)){//count为0时表示未重复
            myset.insert(a);//set中插入元素
            sum=sum*10+a;
        }
        num/=10;
    }
    cout<<sum;
}

这里用set只是为了记录是否重复的,所以set(有序)或unordered_set(无序)都可以。
如果用unordered_set的insert函数,插入默认是插入在最前面,但是不是绝对的,具体是按照哈希表的存储顺序(没有具体看)排列的,总之存储顺序和插入顺序没有绝对联系。
所以如果想用unordered_set保存完后,把内容反序打印出来是不对的。

方法3

钻空子,用string,好倒序

#include<iostream>
#include<set>
using namespace std;
int main(){
    string s,ans;
    cin>>s;
    for(int i=s.length()-1;i>=0;i--){
        if(ans.find(s[i])==s.npos)//判断字符串中字符是否出现,没有出现时返回npos
            ans+=s[i];//连接字符串,从空开始连接
    }
    cout<<ans;
}