把数字翻译成字符串

在这里插入图片描述

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

用了两种办法,一种是类比斐波那契数列的做法(自底向上),一种是从后到前的递归法(会有重复的运算)。

1.斐波那契数列
注意是上一个值和当前值组成一个数进行判断。a = int(str(num)[i-1] + str(num)[i])

class Solution(object):
    def translateNum(self, num):
        if num < 10:
            return 1
            
        if num > 9 and num < 100:
            if int(str(num)[0] + str(num)[1]) >= 10 and int(str(num)[0] + str(num)[1]) <= 25:
                return 2
            else:
                return 1
        pre1 = 1
        cur = 0

        if int(str(num)[0] + str(num)[1]) >= 10 and int(str(num)[0] + str(num)[1]) <= 25:
            pre2 = 2
        else:
            pre2 = 1

        for i in range(2, len(str(num))):

            if int(str(num)[i-1] + str(num)[i]) >= 10 and int(str(num)[i-1] + str(num)[i]) <= 25:
                cur = pre2 + pre1
                pre1, pre2 = pre2, cur
            else:
                cur = pre2
                pre1, pre2 = pre2, cur
        return cur

2.递归
只要是多拆分一种,就多一个1,说明有多一种可能。

class Solution(object):
    def translateNum(self, num):
        if num < 9:
            return 1
        if num % 100 >= 10 and num % 100 <= 25:
            return self.translateNum(num//10) + self.translateNum(num//100)
        else:
            return self.translateNum(num // 10)

牛客网—太恶心了
题目描述
有一种将字母编码成数字的方式:‘a’->1, ‘b->2’, … , ‘z->26’。
现在给一串数字,返回有多少种可能的译码结果

0的带入会引发其他问题。

class Solution:
    def solve(self , nums ):
        if not nums:
            return 0
        dp = [0] * 3
        while nums[0] == "0":
            if len(nums) == 1:
                return 0
            nums = nums[1:]
        dp[0] = 1
        dp[1] = 1
        dp[2] = 1
        for i in range(1, len(nums)):
                if nums[i-1] == "0":
                    if nums[i] == "0":
                        return 0
                    continue
                if nums[i-1] == "1" and nums[i] != "0":
                    if i == 1:
                        dp[1] = 2
                        dp[2] = 2
                    else:
                        dp[2] = dp[0] + dp[1]
                        dp[0] = dp[1]
                        dp[1] = dp[2] 
                elif nums[i-1] == "2" and int(nums[i]) >= 0 and int(nums[i]) <= 6 and nums[i] != "0":
                    if i == 1:
                        dp[1] = 2
                        dp[2] = 2
                    else:
                        dp[2] = dp[0] + dp[1]
                        dp[0] = dp[1]
                        dp[1] = dp[2] 
                else:
                    if i == 1:
                        dp[1] = dp[0]
                        dp[2] = dp[1]
                    dp[2] = dp[1]
                    dp[0] = dp[1]
                    dp[1] = dp[2]
        return dp[2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值