zoukankan      html  css  js  c++  java
  • 每日一题

    题目信息

    • 时间: 2019-07-02

    • 题目链接:Leetcode

    • tag: 动态规划

    • 难易程度:中等

    • 题目描述:

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

    示例:

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

    提示

    1. 0 <= num < 2^31
    

    解题思路

    本题难点

    当数字中包含两位数时,存在两种不同的组合情况。

    具体思路

    动态规划:

    NzK1dH.png

    递推关系:

    NzMptA.png

    注意:dp[0]=dp[1]=1 ,即 “无数字” 和 “第 1 位数字” 的翻译方法数量均为 1

    代码

    class Solution {
        public int translateNum(int num) {
            String s = String.valueOf(num);
            int a = 1 ,b = 1;
            for(int i = 2 ; i <= s.length(); i++){
                String tmp = s.substring(i - 2, i);
                int c = tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0 ? a+b:a;
                b = a;
                a = c;
            }
            return a;
        }
    }
    

    复杂度分析:

    • 时间复杂度 O(N) : N 为字符串 s的长度(即数字 num 的位数 log⁡(num)),其决定了循环次数。
    • 空间复杂度 O(N) : 字符串 s使用 O(N) 大小的额外空间。

    其他优秀解答

    解题思路

    利用求余运算 num%10 和求整运算 num/10 ,可获取数字 num 的各位数字(获取顺序为个位、十位、百位…)。因此,可通过 求余求整 运算实现 从右向左 的遍历计算。动态规划 “对称性” ,可知从右向左的计算是正确的。

    代码

    class Solution {
        public int translateNum(int num) {
            int a = 1, b = 1, x, y = num % 10;
            while(num != 0) {
                num /= 10;
                x = num % 10;
                int tmp = 10 * x + y;
                int c = (tmp >= 10 && tmp <= 25) ? a + b : a;
                b = a;
                a = c;
                y = x;
            }
            return a;
        }
    }
    
  • 相关阅读:
    RepositoryItemComboBox 用法1
    php 直接获取url参数赋值成变量。省去繁琐的获取参数,再一个个赋值
    什么是经验,就是解决问题的能力!!
    win7 上运行 php7 +
    win2008 server 多IP配置
    mysqlli 的基本用法
    PHP操作mongoDB 笔记
    关于PHP程序员技术职业生涯规划 转自 韩天锋
    linux 简单笔记
    ubantu 重启mysql
  • 原文地址:https://www.cnblogs.com/ID-Wangqiang/p/13233471.html
Copyright © 2011-2022 走看看