美文网首页数据结构和算法分析白话算法
面试题解:输入一个数A,找到大于A的一个最小数B,且B中不存在连

面试题解:输入一个数A,找到大于A的一个最小数B,且B中不存在连

作者: 玄魂 | 来源:发表于2018-08-27 14:51 被阅读4次

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

    昨天发的算法有一处情况没考虑到,比如加一后有进位,导致又出现重复数字的情况,修正后今天重新发一次。
    
    比如输入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 data
    
    def 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_data
    
    def 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 False
    
    if __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

    Python算法与数据结构--求所有子数组的和的最大值

    把搜索树转成双向链表

    优秀算法教程推荐

    相关文章

      网友评论

        本文标题:面试题解:输入一个数A,找到大于A的一个最小数B,且B中不存在连

        本文链接:https://www.haomeiwen.com/subject/wvaziftx.html