leetcode165.解密数字

题目表述:

这道题目和斐波那契数列以及跳台阶问题十分相似。

斐波那契数列:0、1、1、2、3、5, 8、13、21、34 …… 

leetcode跳台阶问题:1、1、2、3、5, 8、13、21、34.......

这类题目的特点都是第N项的结果等于前两项的和。

但是解密数字不一样,前面几道题目都是无条件的,直接把前两项的和相加就可以了,这个题目不能直接相加,而是需要判断,然后再进行运算。

假设f(i)代表i个数字之前的解,那么新加入一个数字后,需要考虑两种情况,第一种情况这个数字只能单独翻译成一个字母,这种情况下加了也白加,f(i+1) = f(i); 第二种情况就是这个数字还能和第i个数字联合起来翻译成一个字母,比如10~25之间的两位数都可以被翻译成字母。那这种情况下f(i) = f(i-1) + f(i-2)。事实上因为这个地方无论是个位数还是两位数,最多只能翻译成1种字母,如果可以翻译成多种字母,那么就成了f(i) = g(i) * f(i-1) + g(i-1, i) * f(i-2)。

所以有公式f(i) = f(i-1) +f(i-2) 或者 f(i) = f(i-1)。按道理来说,i是大于等于2的,但是这里有个问题

f(0)=1,这是必然的,但是f(1)是1还是2就难说了。所以还要计算f(1) = f(0) + f(-1)

在斐波那契数列和登台阶的问题中,f(-1)都被设定成了0,但是这里设定成0显然是不合适的。按照f(1)的取值和计算公式应该设定成1

代码:

class Solution {
public:
    int crackNumber(int ciphertext) {
        if(ciphertext<10)
            return 1;
        string src = to_string(ciphertext);
        // f(i) = g(i) * f(i-1) + g(i-2) * f(i-2)
        // f(i) = f(i-1) + f(i-2), i>=2
        // f(2) = f(1) + f(0)
        // f(1) = f(0) + f(-1)
        //   ?  =  1 + ?
        //.  r = q + p
        int r, p, q;
        r = 0;
        p = 1;
        q = 1;
        for(int i=1; i<src.size(); ++i)
        {
            auto pre = src.substr(i-1, 2);
            if(pre>="10" && pre<="25")
            {
                r = p+q;
            }else
            {
                r = q;
            }
            p = q;
            q = r;
        } 
        return r;
    }

};

这是一条吃饭博客,由挨踢零声赞助。学C/C++就找挨踢零声,加入挨踢零声,面试不挨踢!

相关推荐

  1. Leetcode16-有多少小于当前数字数字1365

    2024-07-12 19:30:04       50 阅读
  2. LeetCode 1365. 有多少小于当前数字数字

    2024-07-12 19:30:04       36 阅读
  3. Leetcode 169

    2024-07-12 19:30:04       39 阅读
  4. 轮转数组 - LeetCode 热题 15

    2024-07-12 19:30:04       37 阅读
  5. Leetcode 165. 比较版本号

    2024-07-12 19:30:04       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 19:30:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 19:30:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 19:30:04       58 阅读
  4. Python语言-面向对象

    2024-07-12 19:30:04       69 阅读

热门阅读

  1. CVE漏洞爬虫脚本

    2024-07-12 19:30:04       20 阅读
  2. 掌握Postman的API请求模板:一键生成,效率倍增

    2024-07-12 19:30:04       23 阅读
  3. Vue中的Mixins与钩子函数:理解合并与调用

    2024-07-12 19:30:04       24 阅读
  4. Todo List

    2024-07-12 19:30:04       21 阅读
  5. ARM/Linux嵌入式面经(十):极氪

    2024-07-12 19:30:04       18 阅读
  6. 【网络安全】一文带你了解什么是【sql注入】

    2024-07-12 19:30:04       19 阅读
  7. Flowable工作流引擎核心事件详细解释说明

    2024-07-12 19:30:04       26 阅读
  8. SQL 视图

    2024-07-12 19:30:04       20 阅读
  9. 开发需要的热门常用API

    2024-07-12 19:30:04       21 阅读
  10. sql server记录数据库表行数变化记录

    2024-07-12 19:30:04       23 阅读
  11. 小抄 20240711

    2024-07-12 19:30:04       20 阅读
  12. vscode 远程开发

    2024-07-12 19:30:04       18 阅读
  13. clean code-代码整洁之道 阅读笔记(第十六章)

    2024-07-12 19:30:04       17 阅读