算法(LeetCode_面试题46_把数字翻译成字符串)

算法

:一个中等难度的面试题,涉及动态规划内容,然后我就又不会了,我就又看了题解(什么时候我才能正儿八经学会自己用动态规划)

题目

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

示例

示例 1:

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”

思路

  • 别问,问就动态规划
  • 关于这道题动态规划的规划方程,可以取一个点作为当前读到的最后点,然后去计算读到这个点的最大翻译方法数,我们叫当前点为i,那么其之前一个点就是i-1,如果我们将i独立翻译,那么读到i点的最大翻译方法数就等于i-1的最大翻译方法数,如果i-1和i可以连起来翻译,我们将其连起来翻译,那么读到i点的最大翻译方法数就等于i-2的最大翻译方法数。而如上俩个情况,i独立翻译是没有条件的,但是i-1和i一起翻译存在限制条件,即他们俩的和应该在10和25之间。说白了独立翻译任何条件下都成立,即其最大翻译方法数保底为i-1的最大翻译方法数,如果满足了那个特殊条件,那么其最大翻译方法数可以在保底之上再加上i-2的最大翻译方法数。
  • 方程表示:
    如果(25>=(10*i-1)+i>=10) :f(i) = f(i-1)+f(i-2)
    否则f(i) = f(i-1)

Java代码

public class Solution
{
    public int translateNum(int num) {
        int r [] = {0,1,1,0};         //上一位数,俩位前的翻译方式,一位前的翻译方式,当前位的翻译方式
        int n = 1;
        while(num/n>=10)
        {
            n*=10;
        }
        while(n>0)
        {
            if((r[0]*10+num/n)>=10&&(r[0]*10+num/n)<=25)
            {
                r[3] = r[1]+r[2];
            }
            else
            {
                r[3] = r[2];
            }
            r[0] = num/n;
            num -= (num/n)*n;
            n/=10;
            r[1] = r[2];
            r[2] = r[3];
        }
        return r[3];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值