题解 | #提取不重复的整数#

提取不重复的整数

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,来返回最终的结果。

图解:

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)

全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务