玄魂工做室秘书 [玄魂工做室] python
昨天发的算法有一处状况没考虑到,好比加一后有进位,致使又出现重复数字的状况,修正后今天从新发一次。面试
好比输入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仍是有重复,则须要从新处理。code
# -*- 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教程
更多算法内容,欢迎关注 订阅号“白话算法:utf-8