52

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

 6 years ago
source link: http://www.cnblogs.com/xuanhun/p/9542213.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

比如输入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

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

yqiEVzq.png!web

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

把搜索树转成双向链表

优秀算法教程推荐


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK