题目的主要信息:
- 输入一个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;
}
复杂度分析:
- 时间复杂度:,int型整数的位数是常数级,而字符串output的长度不会超过10,查找字符也不会超过10次,整体就是常数级的
- 空间复杂度:,两个字符串记录数字,还是常数级空间
方法二:哈希表
具体做法:
我们可以用一个哈希表表示0-9这10个数字是否出现过,然后利用除法和取余逆序遍历数字的每一位,提前查看哈希表它是否出现过了,如果没有出现了,则可以输出并在哈希表中标记,否则直接跳过。
#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;
}
复杂度分析:
- 时间复杂度:,实际上int型变量的是常数级
- 空间复杂度:,无额外空间