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()
运行结果如下:
相关文章推荐
- 大神程序员的思想
- (面试)操作系统相关(不断丰富中…)
- 【面试论述】const的作用、使用举例与#define联系
- 【经典面试题】给一组数,只有两个数只出现了一次,其他所有数都是成对出现的。怎么找出这两个数
- 【面试简答题(详谈)】宏与函数的区别
- 只因路不同 —— 我选择了做一个程序员
- 奋斗吧,程序员——第四十八章 千金纵买相如赋,脉脉此情谁诉
- JAVA异常面试题
- 2016/05 - Mars ISC 面试过程全记录
- 面向程序员的数据库访问性能优化法则
- 给程序员的忠告(10年程序员分享的一些生活见解)
- 面试题:return和finally执行
- 面试题:return和finally执行
- Java异常面试题
- Android 面试题总结之Android 基础(六)
- 面试题:return和finally执行
- 大数据面试题分享
- java异常面试题
- 前端面试题
- 这7件事情是影响程序员效率的关键