题解 | #提取不重复的整数#
提取不重复的整数
http://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1
提取不重复的整数
描述:输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。 保证输入的整数最后一位不是0。
输入描述:输入一个int型整数
输出描述:按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
示例1:输入:9876673
输出:37689
方法一:
思路分析: 本题中明确规定了循环的顺序为从右到左,需要返回的是一个不含重复数字的新的整数,因为数字1-10一共只有10个数字,所以可以设定一个数组a,初始为全0,用于记录数字1-10的应用情况,使用scanf输入n,通过对n不断取余来记录数组a的数字,通过m = m*10 + n%10,来返回最终的结果。
图解:
核心代码:
#include<stdio.h>
#include<string.h>
int main(){
int n,m = 0;
scanf("%d",&n);//输入值
int a[10] = {0};//初始化数组a
while(n){
if(a[n%10] == 0){//如果次数为0,进入循环
a[n%10]++;
m = m*10 + n%10;
}
n /= 10;//下一位
}
printf("%d\n",m);//输出结果值
return 0;
}
时间复杂度:判断输入数据n的位数,以此得到循环的次数,最大时间复杂度为。
空间复杂度:采用了一个定长的数组a,空间复杂度为。
方法二:
思路分析: 本题可以直接从最后一位开始循环,一直到第一位,若该字符不在res中,就将字符添加进res中,若res中包含该字符,则直接跳过,判断下一位,返回最终结果即可。
核心代码:
num = input()
res = ''#存放地址
len1 = len(num)#循环长度
for i in range(len1-1,-1,-1):
if num[i] not in res:
res = res + num[i]#添加
print(res)#返回
时间复杂度:首先判断输入数据n的位数代替循环的长度,时间复杂度为。
空间复杂度:不需要借助辅助数组,因此空间复杂度为。