【编程题】金山云笔试题——字母密码转换排列问题

问题描述

数字加密,字母与数字之间的映射如下:[‘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-8

a = input()
b = []
id_head = 0
for 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 = 1
fib = 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值