博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题解:输入一个数A,找到大于A的一个最小数B,且B中不存在连续相等的两个数字...
阅读量:7129 次
发布时间:2019-06-28

本文共 2497 字,大约阅读时间需要 8 分钟。

玄魂工作室秘书 [玄魂工作室] 

    昨天发的算法有一处情况没考虑到,比如加一后有进位,导致又出现重复数字的情况,修正后今天重新发一次。

    比如输入99,那B应该是101 因为100有两个连续相当的0。

    基本思路:最坏的办法 加1一直加1 直到找到有不重复的数为止。

    面试:这道题要是作为面试题的话,要跟面试官确认好,数A的范围,比如是否有小数是否有负数,等等。在这里我们把题确定为正数。

     优化思路:

     如果输入的数本身不存在重复,则加1;如果存在重复,比如我们输入的是11100234,那如果要找比11100234大的最小没有重复的数,最先重复的两位数是11,那么如果想让11不重复并且比11100234大,那么应该让第二位的1加1 变成12100234。然后为了让数字最小,则把2后面的数字都变成0,变成12000000;然后在从2后开始找不重复数,00重复,变成01;所以结果是12010101。这里需要注意:如果变化后又进位的情况,还需要重新处理一遍,比如199,第一遍处理后变成了200,200还是有重复,则需要重新处理。

# -*- coding: utf-8 -*-"""题目:输入一个数A,找到大于A的一个最小数B,且B中不存在连续相当的两个数字。比如输入99,那B应该是101 因为100有两个连续相当的0基本思路:最坏的办法 加1一直加1 直到找到有不重复的数为止优化的思路 如果输入是1099 加1后变成1100,那么他下一个不重复的数如果一直加1效率就会比较低,这是可以优化的点这道题要是作为面试提的话,要跟面试官确认好,数A的范围,比如是否有小数是否有负数,等等。在这里我们把题确定为正数"""def get_data(num):    """    获取num个10相乘的数字,为了让重复的数字加1,比如num=4 则返回10000    args:需要0的个数    """    data = 1    while num > 0:        data = data * 10        num = num -1    return datadef get_tail(num, data):    """    获取data的后面num个数,比如data=1345 num=3 则返回345    args:num需要取后几位 data数字    """    list_data = []    #获取到num位0的数字    head = get_data(num)    #用抹除的方式获取后几位    need_data = data % head    return need_datadef judge(data):    """    判断data中是否有连续重复数字    args:data数字    """    i = 1    while i < len(data):          #判断是否有两个数字相等        if string_num[i-1] == string_num[i]:            return True        i = i + 1    return Falseif __name__ == "__main__":      #输入的数字     num = 1099    num = num + 1    #数字转字符串,为了判断是否有相等的数字    string_num = str(num)       i = 1    flag = 0     while True:          if(judge(string_num)==False):            break        while i < len(string_num):              #判断是否有两个数字相等            if string_num[i-1] == string_num[i]:                #如果有重复的数字,则把重复的两个数,中小的一位数字加1,然后在把后面的位置0                new_len = len(string_num) - i - 1                num = num + get_data(new_len)                tail = get_tail(new_len, num)                #置0的办法是用num减掉后面的几位数                num = num - tail                string_num = str(num)                flag = 1            #置0后 在找后面几位去找不重复的最小数            i = i + 1         #如果flag=0 证明没有重复的 证明找到了不重复的数字,则退出         if flag == 0:            num = num + 1            string_num = str(num)        #如果flag=0 并且运算到了最后一位        if flag == 1 and i >=len(string_num):            #在判断下是否有重复,如果有重新算,没有则停止            if(judge(string_num)):                i = 0                flag = 0                 continue            else:                break    print  string_num

1099输出是:1201 ; 99 输出是:101; 9 输出是:12 ;1098 输出是:1201

更多算法内容,欢迎关注 订阅号“白话算法:

image

转载地址:http://ykael.baihongyu.com/

你可能感兴趣的文章
第十八章:MVVM(二)
查看>>
进程调度(二)
查看>>
python元组,集合类型,及字典补充
查看>>
9、python函数进阶
查看>>
Markdown一看就会
查看>>
dotweb——go语言的一个微型web框架(一)
查看>>
又是一个名叫草泥马的项目:thefuck
查看>>
《七周七并发模型》作者Paul Butcher访谈问题有奖征集
查看>>
linux基本功能的一些命令(用户,系统信息,包管理等)
查看>>
使用 dnscrypt-proxy 防止 dns 污染
查看>>
专访孙睿 :能做自己,去做自己想做的,是件挺幸福的事儿
查看>>
滴滴开源跨平台统一 MVVM 框架 Chameleon
查看>>
玖锦科技完成1.1亿元融资,中信惠科基金领投
查看>>
JavaWeb_常用功能_01_文件上传
查看>>
Git for Windows 2.21.0 发布,Win 下的 Git 客户端
查看>>
JSON和XML格式转换
查看>>
XXL-RPC v1.3.2,分布式服务框架
查看>>
将c++静态库实现二次封装供java调用
查看>>
在阿里云kubernetes上部署Jenkins Master
查看>>
VueJs开发笔记—IDE选择和优化、框架特性、数据调用、路由选项及使用
查看>>