题目的主要信息:

  • 输入一个int型整数,按照数字从右到左的顺序返回,返回不含重复数字的新的整数
  • 输入的数字最后一位不是0

方法一:字符串解法

具体做法:

我们可以将输入的数字看成一个字符串,然后从后往前遍历字符串,每个字符与待输出的字符串(一开始为空)比较(使用字符串的find函数),如果待输出的字符串中已经有了这个字符,我们将它舍去,否则将该字符添加到待输出的的串末尾。

#include<iostream>
#include<string>
using namespace std;

int main(){
    string s;
    cin >> s;
    string output;
    for(int i = s.length() - 1; i >= 0; i--)  //从后往前遍历数字
        if(output.find(s[i]) == string::npos) //如果字符在新串中没有出现过才添加
            output += s[i];
    cout << output << endl;
    return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),int型整数的位数是常数级,而字符串output的长度不会超过10,查找字符也不会超过10次,整体就是常数级的
  • 空间复杂度:O(1)O(1),两个字符串记录数字,还是常数级空间

方法二:哈希表

具体做法:

我们可以用一个哈希表表示0-9这10个数字是否出现过,然后利用除法和取余逆序遍历数字的每一位,提前查看哈希表它是否出现过了,如果没有出现了,则可以输出并在哈希表中标记,否则直接跳过。

alt

#include<iostream>
#include<vector>
using namespace std;

int main(){
    vector<bool> flag(10, false);  //十个数字是否出现过
    int n;
    cin >> n;
    while(n > 0){ //遍历每位数字
        int temp = n % 10;
        n /= 10;
        if(flag[temp] == false){ //如果数字没有出现过则输出
            cout << temp;
            flag[temp] = true;
        }
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(log10n)O(log_{10}n),实际上int型变量nnlog10nlog_{10}n是常数级
  • 空间复杂度:O(1)O(1),无额外空间