python输入两个整数a和b、比较两者的大小、使得a大于b_面试题解:输入一个数A,找到大于A的一个最小数B,且B中不存在连续相等的两个数字...

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

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

比如输入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 输出是:10 ;1098 输出是:1201

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

format,png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值