2016.5.30 jd算法面试题

来源:互联网 发布:js获取本地服务器地址 编辑:程序博客网 时间:2024/06/04 18:54
# encoding=utf-8# 2016.5.30 jd算法面试题# 问题描述:# 给出一张手机号码表# 1 2 3# 4 5 6# 7 8 9#   0# 从1开始,每次只能往右、往下走一格、或者不走# 走到了某一格上可以选择按或者不按# 现在给出一个数字,判断该数字能否通过以上方式得到# 可以则返回数字本身# 不行则返回比该数字小的数中的最大数# example:#   input: 1477     return: 1477#   input: 2560     return: 2559#   input: 4587     return: 4580# 先定义迁移字典move_dict = {1:range(2,10)+[0],             2:[2,3,5,6,8,9,0],             3:[3,6,9],             4:range(4,10)+[0],             5:[5,6,8,9,0],             6:[6,9],             7:range(7,10)+[0],             8:[8,9,0],             9:[9],             0:[0]}def judge(string):    val = [int(x) for x in string]    i = 0    while i<len(val)-1:        if val[i+1] in move_dict[val[i]]:            i += 1            continue        else:            # 一旦不符合规则,就需要改数,过程如下            max_v = None            # 在val[i]的下一位中寻找小于val[i+1]的最大数            for va in sorted(move_dict[val[i]]):                if va<val[i+1]:                    max_v = va##            print 'max_v: ', max_v            if max_v is None:                # 如果没找到,则回溯                val[i] -= 1            else:                val[i+1] = max_v                i += 1            # 改完i/i+1后,剩余位可以自动修改为最大            for j in range(i+1,len(val)):                val[j] = max(move_dict[val[j-1]])            break    return int( ''.join([str(x) for x in val]) )def test_judge():    import random    for i in range(10):        num = str(random.randint(0,10**4))        print num+': ', judge(num)test_judge()

运行结果如下:








0 0