【编程题】金山云笔试题——字母密码转换排列问题
来源:互联网 发布:郑州seo外包公司 编辑:程序博客网 时间:2024/05/21 17:31
问题描述
数字加密,字母与数字之间的映射如下:[‘A' => 1, 'B' => 2, ... , 'Z' => 26],给定一串数字,求出所有可能结果的数量。
例如:输入:2312,输出为4,表示可解码成BCAB、BCL、WAB、WL四种。
分析
这道题最终可以转化成斐波那契数列进行计算。首先要确定的是,只有在数值小于26的时候,才可能出现多种解码,例如,当数字是12,可以解码成AB或者L,当数值大于26则只有唯一解码,例如,当数字是34,解码只有CD,因此可从这个角度出发来解决这个问题,即先对数字进行判断,如果大于2,则进行切分,如果等于二,考虑后面一个数是否大于6,如果大于6,则切分,不大于6则不变,例如:12213411可以切分成12213、4、11三部分,1227126可以切分为122、7、126三部分,之后对拆分之后的每个子集进行分析,分析的主要依据和之前类似,由于无论如何组合,能够进行解码的数字一定不能是三位数,所以对每一个子集再进行组合,这时候你会发现,在上面讨论的前提下,会形成一个解码个数随子集中元素个数变化的斐波那契数列(这个斐波那契数列没有第一项的1),求得每个子集解码个数之后,将这些数字相乘就得到了最终结果。
代码实现
# encoding:utf-8a = input()b = []id_head = 0for i in range(len(a)): if int(a[i])>2: b.append(a[id_head:i+1]) id_head = i+1 elif i == len(a)-1: b.append(a[id_head:i + 1])num = 1fib = lambda n:1 if n<=2 else fib(n-1)+fib(n-2)for i in range(len(b)): num = num * fib(len(b[i])+1)print(num)
阅读全文
0 0
- 【编程题】金山云笔试题——字母密码转换排列问题
- 金山笔试题——数位累加
- 【编程题】网易有道笔试题——数字位数全排列整除问题
- kingsoft金山笔试题
- 金山笔试题集锦
- 金山部分笔试题
- 一道金山笔试题
- 金山的笔试题
- 金山笔试题9.25
- 金山笔试题 C++
- 金山软件笔试题
- 金山一道笔试题
- 金山WPS笔试题
- 231 金山笔试题
- 金山笔试题二
- 2014金山网络实习生招聘——Android笔试题
- 一道2005金山笔试题
- 金山软件网上笔试题
- 7-6 用原子和字表的存储结构 , 编写求广义表长度的函数
- Codeforces Round #436 (Div. 2) E. Fire
- [线段树] BZOJ2957: 楼房重建
- Fragment的使用二
- 文章标题
- 【编程题】金山云笔试题——字母密码转换排列问题
- jQuery学习笔记(七)_ jQuery核心总结
- 时间复杂度从O(n^3)到O(n^2)的优化
- 19. php 编译 pcntl
- 爬虫第一天(3)
- 2017ICPC 南宁网络赛M Frequent Subsets Problem
- 0博文资料目录---------------------------------------------------------------------------------------------
- java项目中Excel文件的导入导出
- #PHP#(二)变量和常量