提取不重复的整数

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

输入描述:输入一个int型整数

输出描述:按照从右向左的阅读顺序,返回一个不含重复数字的新的整数

示例1:输入:9876673

输出:37689

方法一

思路分析: 本题中明确规定了循环的顺序为从右到左,需要返回的是一个不含重复数字的新的整数,因为数字1-10一共只有10个数字,所以可以设定一个数组a,初始为全0,用于记录数字1-10的应用情况,使用scanf输入n,通过对n不断取余来记录数组a的数字,通过m = m*10 + n%10,来返回最终的结果。

图解:

alt

核心代码:

#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的位数,以此得到循环的次数,最大时间复杂度为O(n)O(n)

空间复杂度:采用了一个定长的数组a,空间复杂度为O(1)O(1)

方法二:

思路分析: 本题可以直接从最后一位开始循环,一直到第一位,若该字符不在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的位数代替循环的长度,时间复杂度为O(n)O(n)

空间复杂度:不需要借助辅助数组,因此空间复杂度为O(1)O(1)