剑指offer:把数字翻译成字符串

题目要求:
给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”...25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。

# -*- coding: utf-8 -*-
# @Time         : 2019-07-10 21:13
# @Author       : Jayce Wong
# @ProjectName  : job
# @FileName     : getTranslationCount.py
# @Blog         : https://blog.51cto.com/jayce1111
# @Github       : https://github.com/SysuJayce

def getTranslationCount(number):
    """
    要将一个数字转化成一个字符串,由于这个数字有很多位,我们最直观的就是从头开始,一位一位地去转化。
    比如给定12258. 我们可以先把1翻译成b,然后剩下2258;也可以先把12翻译成m,然后剩下258.。。

    由此可见是一个递归问题,用递归的思路分析题目,用循环来解决问题(动态规划)
    递推公式为:f(i) = f(i+1) + g(i, i+1) x f(i+2)

    其中f(i)表示到下标为i的数字为止,共有多少种可能的翻译。之所以写成向前递推的公式,是因为如果我
    们从前往后翻译,会出现很多重复的子问题,比如12258=1 | 2258,其中2258=2 | 258,而12258=12 | 258,
    这样258就重复了。
    所以我们从后往前翻译,就可以避免这样的重复子问题。
    """
    def helper(s):
        # 一个数字至少有一种翻译,因此可以先设置一个全为1的数组,长度对应数字的位数加一
        counts = [1] * (len(s) + 1)
        # 对于前面的n-1位
        for i in range(len(s) - 2, -1, -1):
            # 第i位至少有和第i+1位一样多的翻译数
            count = counts[i + 1]
            # 如果第i位和第i+1位可以组合成一个10-25的数字,那么g(i, i+1) = 1
            # f(i) = f(i+1) + g(i, i+1) x f(i+2)
            # 由于我们设置的数组长度是位数+1,因此这里i+2不可能越界
            if 10 <= int(s[i: i + 2]) <= 25:
                count += counts[i + 2]
            counts[i] = count
        return counts[0]

    # 由于0对应a,25对应z,因此小于0的输入是无效的
    if number < 0:
        return 0

    return helper(str(number))

原文地址:https://blog.51cto.com/jayce1111/2419152

时间: 2024-10-25 02:55:05

剑指offer:把数字翻译成字符串的相关文章

剑指Offer对答如流系列 - 把数字翻译成字符串

面试题46:把数字翻译成字符串 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻译成"b",--,11翻译成"l",--,25翻译成"z".一个数字可能有多个翻译.例如12258有5种不同的翻译,它们分别"bccfi", "bwfi", "bczi", "mcfi" 和"mzi" .请编程实现一个函

《剑指offer》第四十六题:把数字翻译成字符串

// 面试题46:把数字翻译成字符串 // 题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻 // 译成"b",……,11翻译成"l",……,25翻译成"z".一个数字可能有多个翻译.例 // 如12258有5种不同的翻译,它们分别是"bccfi"."bwfi"."bczi"."mcfi"和 // "mzi&qu

【剑指offer】数字在排序数组中出现的次数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27364557 题目描写叙述: 统计一个数字在排序数组中出现的次数. 输入: 每一个測试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每一个元素均为int. 第三行有1个整数m,表示接下来有m次查询.1<=m<=10^3. 以下有m行,每行有一个整数k,表示要查询的数. 输出: 相应每一个測试案例,有m行输出,

剑指Offer:二叉树打印成多行【23】

剑指Offer:二叉树打印成多行[23] 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题目分析 Java题解 package tree; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; public class PrintByLevel { public static void main(String[] args) { TreeNode t1 = n

剑指offer——48把数字翻译成字符串

题目要求: 给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”...25翻译成“z”.一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi.实现一个函数,用来计算一个数字有多少种不同的翻译方法. 解题思路: 下面我们从自上而下和自下而上两种角度分析这道题目,以12258为例: 自上而下,从最大的问题开始,递归 : 有很多子问题被多次计算,比如258被翻译成几种这个子问题就被计算了两次. 自然想到可以用动态规划来解决,用f(i

【Offer】[46] 【把数字翻译成字符串】

题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串: 0翻译成"a",1翻译成"b",..... 11翻译成"1",...... 25翻译成"z".一个数字可能有多个翻译.例如,12258有5种不同的翻译,分别是"bccfi""bwfi"."bczi"."mcfi"和"mzi&q

剑指offer剖析__空格替换字符串问题

问题:在"we are happy"这个字符串中,将所有的空格替换成字符串%20. 分析:如果我们不定义一个新的字符数组,就在原字符数组中进行替换,要将一个字节的空格替换成三个字节的字符数组%20,这会产生数组的越界访问,如果允许我们开辟一个新的空间来存放替换后的字符串,则问题将会变得非常简单. 设置两个指针分别指向新旧字符串首元素,遍历原字符串,如果碰到空格就在新字符串上填入"%20",否则就复制元字符串上的内容. #include <stdio.h>

剑指OFFER----面试题46. 把数字翻译成字符串

链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/submissions/ 代码 class Solution { public: int translateNum(int num) { int n = 0; string s = ""; while (num) { s += to_string(num % 10); num /= 10; n++; } reverse(s.begin(

剑指Offer解题报告(Java版)——字符串转换为数字 49

? ? 引言 ? ? STOI是很常见的一道题,leetcode上也有,字符串转换为数字一般都会有现成的函数去实现这样的功能,但有时候需要我们理解其中的具体实现,因为虽然是个很常见的问题,但实际上需要考虑的问题还是很多的,尤其是corner case的处理,而这类问题一般要考虑两点:一点是符号,另外一点是越界 ? ? 分析问题 ? ? 如果字符串前面有空格怎么办,一般来说中间是没有空格的,但是前后可能有空格,所以我们首先需要去掉多余的空格字符,用到trim函数 ? ? 然后就是字符串中有可能第一