给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
解题思路在于,动态规划,假如用dp来存储n个数字的解法为dp[n],list为存储n个数字的数组
那么: dp[0]=1 只有一个数字
dp[1]=dp[0] + list[i-1] > 0 && Number(list[0]+list[1]) < 26 ? 1 : 0 两个数字,首先把第二个数字当做单个数字则只有一种解法也就是加上上一个数字的解dp[0],再将之前的第一个数字和第二个数字连起来,在0-25之前则增加一种解法,否则保持之前的解,这里需要判断前一个数字是否为0,为0则继续之前的解
dp[2]=dp[1]+dp[0] * list[1] > 0 && Number(list[1]+list[2]) < 26 ? 1 : 0 以此类推
... dp[n]=dp[n-1]+dp[n-2]*list[n-1] > 0 && Number(list[n-1]+list[n]) < 26 ? 1 : 0
最后可以用三个值来替换数组的存储空间
var translateNum = function(num) {
let list = (num).toString().split('')
if(list.length === 1){
return 1
} else if(list.length ==2) {
return Number(list[0]+list[1]) > 25 ? 1 : 2
}
let a = 1
let b = Number(list[0]+list[1]) > 25 ? 1 : 2
let c = 0
for(let i = 2; i< list.length; i++) {
let forward = list[i-1]>0 && Number(list[i-1]+list[i]) < 26 ? 1 : 0
c= b + a * forward
a = b
b = c
}
return c
};
网友评论