您的位置:首页 > 职场人生

2016.5.30 jd算法面试题

2016-05-30 18:33 387 查看
# 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()

运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: