剑指Offer(第二版)面试题46:把数字翻译成字符串

把数字翻译成字符串 一、需求 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。 一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例1: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi" 二、动态规划法(字符串) 2.1 思路分析 该题要求按照给定规则将数字翻译成. 阅读详情

剑指Offer(第二版)面试题46:把数字翻译成字符串

题目要求:

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

解题思路:

下面我们从自上而下和自下而上两种角度分析这道题目,以12258为例:

自上而下,从最大的问题开始,递归 :
                     12258
                   /       \
              b+2258       m+258
              /   \         /   \
          bc+258 bw+58  mc+58  mz+8
          /  \      \        \     \
      bcc+58 bcz+8   bwf+8   mcf+8  mzi
        /        \       \     \
   bccf+8        bczi    bwfi   mcfi
     /
 bccfi
有很多子问题被多次计算,比如258被翻译成几种这个子问题就被计算了两次。

自下而上,动态规划,从最小的问题开始 :
f(r)表示以r为开始(r最小取0)到最右端所组成的数字能够翻译成字符串的种数。对于长度为n的数字,f(n)=0,f(n-1)=1,求f(0)。
递推公式为 f(r-2) = f(r-1)+g(r-2,r-1)*f(r);
其中,如果r-2,r-1能够翻译成字符,则g(r-2,r-1)=1,否则为0。
因此,对于12258:
f(5) = 0
f(4) = 1
f(3) = f(4)+0 = 1
f(2) = f(3)+f(4) = 2
f(1) = f(2)+f(3) = 3 
f(0) = f(1)+f(2) = 5

作者:ryderchan
链接:https://www.jianshu.com/p/80e1841909b7
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

C++代码

#include <iostream>
#include <string>

using namespace std;

int GetTranslationCount(int num);
int GetTranslationCount(const string& num);

int main()
{
    int num = 0;
    while(num != -1)
    {
        cout << "input a number "<<endl;
        cin >> num;
        int result = GetTranslationCount(num);
        cout << "result: " << result << endl;
    }
    return 0;
}

int GetTranslationCount(int num)
{
    if(num < 0)
        return -1;
    string strNum = to_string(num);
    int result = GetTranslationCount(strNum);
    return result;
}

int GetTranslationCount(const string& num)
{
    int length = num.size();
    int* counts = new int[length];
    int count = 0;
    for(int i = length - 1; i >= 0; --i)
    {
        if(i < length - 1)
            count = counts[i+1];
        else
            count = 1;

        if(i < length - 1)
        {
            int digit1 = num[i] - '0';
            int digit2 = num[i+1] - '0';
            int twoNum = digit1 * 10 + digit2;
            if(twoNum <= 25 && twoNum >= 10)
            {
                if(i < length - 2)
                    count += counts[i+2];
                else
                    count += 1;
            }
        }

        counts[i] = count;
    }
    count = counts[0];
    delete[] counts;
    return count;
}

参考文献

Python版剑指Offer题解 Python版剑指Offer题解 本题解配合leetcode中剑指Offer刷题使用 参考链接:图解算法数据结构 文章目录剑指 Offer 03. 数组中重复的数字剑指 Offer 04. 二维数组中的查找剑指 Offer 05. 替换空格剑指 Offer 06. 从尾到头打印链表剑指 Offer 07. 重建二叉树剑指 Offer 09. 用两个栈实现队列剑指 Offer 10- I. 斐波那契数列剑指 Offer 10- II. 青蛙跳台阶问题剑指 Offer 11. 旋转数组的最小数字剑指 Offe 阅读详情

相关推荐

ADS仿真设计平行定向耦合器学习笔记

ADS仿真设计平行定向耦合器

qq_36521926的博客 1万+

剑指 Offer 46. 把数字翻译成字符串(动态规划)1

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi" 解法一: class Solution { public int translateNum(int

秋雨行舟 522

每天10分钟,混剪视频Agent产出50条爆款,单月变现6位数(喂饭级教程)

混剪视频是指将多个视频片段、图片或音频素材进行剪辑组合,创造出新的视频内容。随着Coze上线联动剪映功能,混剪视频制作正在进入自动化时代,为创作者带来巨大便利。高效自动化处理:AI可以自动完成琐碎的剪辑工作,让创作者省下大量时间专注于项目策划和创意。批量素材产出:特别适用于抖音、小红书和视频号等平台上的养生、科普、心理、疗愈等垂直领域,可以自动化批量生产图片和视频素材。引流获客:通过优质内容吸引目标受众知识变现:通过教学传授技术工具变现:将搭建好的工作流作为产品销售。

汤师爷的博客 864

把数字翻译成字符串python_LeetCode 面试题46. 把数字翻译成字符串 | Python

面试题46. 把数字翻译成字符串题目给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "m...

weixin_39923623的博客 382

麒麟V10等保三级配置实战:从auditd规则到PAM锁定的可信基线构建

Linux安全基线是信息系统可信运行的基础能力,其核心在于身份鉴别、访问控制与安全审计三大机制的协同落地。在国产化信创环境中,麒麟V10作为深度适配飞腾/鲲鹏平台的操作系统,其等保三级合规并非简单套用CentOS加固脚本,而是需围绕内核审计(auditd)、可插拔认证模块(PAM)及国产安全增强机制(如kysec)进行精细化编排。技术价值体现在将抽象条款(如GB/T 22239-2019中6.1.2、6.3.3条)转化为可验证的命令行操作,确保登录失败可锁定、关键行为可追溯、时间偏差不致日志失效。典型应用场

weixin_29969209的博客 594

攻防世界:Crypto习题之easy_RSA

在非对称加密算法中,单向函数被广泛应用,用于确保从公钥加密后的密文无法轻易推导出私钥,从而保证数据的安全性。而其中最著名的算法便是 RSA 加密算法。首先设φm:=∣1≤k≤mgcdkm1∣为欧拉函数(Euler’sche Phi-function)。pqn:=pqpqφnnpqpqφnp−1q−1e∈12...φn−1gcdφne1ended≡1φn假设我们现在有明文x以及公钥en。

qq_52789488的博客 1569

把数字翻译成字符串-C++

// 面试题46:把数字翻译成字符串 // 题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻 // 译成"b",……,11翻译成"l",……,25翻译成"z"。一个数字可能有多个翻译。例 // 如12258有5种不同的翻译,它们分别是"bccfi"、"bwfi"、"bczi"、"mcfi"和 // "mzi"。请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。 #include #include using namespace s

了解➔熟悉➔掌握➔精通 737

LWIP协议栈在STM32H7上的内存优化实战:如何用32KB RAM实现稳定千兆以太网通信

本文深入探讨了在STM32H7微控制器上,如何通过内存优化策略,在仅32KB的D2 SRAM中稳定运行LWIP协议栈以实现千兆以太网通信。文章详细分析了STM32H7的内存架构、LWIP的内存消耗瓶颈,并提供了从描述符表与PBUF池精确分配、链接脚本修改到MPU区域划分的一整套实战优化方案,旨在解决大数据量传输卡死等常见配置问题。

gg901的博客 603

《剑指Offer(第二版)》面试题46. 把数字翻译成字符串

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi" ...

今晚打老虎 247

YOLOv8高级应用实战:多目标跟踪+实例分割+小样本检测(工业/安防场景落地指南)

安防监控中,需要跟踪多个行人的运动轨迹,而不只是框出“这是行人”;工业质检时,要精确分割出零件的缺陷区域(像素级),而不是只给一个粗略的矩形框;罕见场景下(如特殊故障检测、稀有动物识别),只能收集到几十张样本,普通训练方法精度惨不忍睹。我在落地工业安防和质检项目时,把YOLOv8的高级功能摸了个遍,踩过“多目标跟踪遮挡丢帧”“实例分割边缘模糊”“小样本检测过拟合”等一系列坑,最终总结出这套可直接复用的实战方案。多目标跟踪(ByteTrack)、实例分割、小样本检测。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 750

【突变检验方法一】MATLAB实现Pettitt突变检验

MATLAB实现Pettitt突变检验及贝叶斯突变检测等

WW、forever的博客 1万+

Leetcode刷题:剑指offer【面试题46 把数字翻译成字符串】

【面试题46 把数字翻译成字符串】 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 Leetcode题目对应位置: 面试题46:把数字翻译成字符串 思路:动态规划问题。 观察发现,不断扩展一个数字串时,如果新添加的数字和前一位数字不能合并为一个可转化为字符的两位数,那么新添加的数字对整体能够实现的翻译数量并没有贡献。 比如 “

学习 & 分享 ~ 460

智能手表 BOM 表与版本管理记录

试产与量产阶段 智能手表 BOM 表与版本管理记录

hoony123的博客 1053

剑指 Offer 46. 把数字翻译成字符串 【 c++/java详细题解 】

1、题目 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi" 提示: 0 <= num < 2^31 2、思路 (动态规划) O(logn)O(log

林深不见鹿 的博客 3336

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++:剑指Offer第二版46题:把数字翻译成字符串

剑指Offer第二版46题:把数字翻译成字符串原题链接地址新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 原题链接地址 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown

weixin_42329812的博客 356

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【LeetCode & 剑指offer刷题】动态规划与贪婪法题3:剑指Offer-46:把数字翻译成字符串...

【LeetCode &amp; 剑指offer刷题】动态规划与贪婪法题3:剑指Offer-46:把数字翻译成字符串 【LeetCode &amp; 剑指offer 刷题笔记】目录(持续更新中...) 剑指Offer-46:把数字翻译成字符串 题目: 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成“a”,1翻译成“b”,……,11翻译成...

技术改变世界 983

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【剑指Offer】46. 把数字翻译成字符串

点击做题 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 解题思路 class Solution { public int translateNum(int num) { String s = String.valueOf(num); // 0 ~ 25

瑞新の博客:bennyrhys 2320

【C++题解】剑指offer第二版,面试必备专栏

📚专栏目标:剑指offer系列题解📣专栏定位:为找工作的小伙伴整理常考算法题解,祝大家都能成功上岸!🎏唠叨唠叨:在这个专栏里,我会整理所有剑指 offer 第二版的题解,这里面的思路也参考了各个大佬。一方面我希望通过这个专栏加深我对于剑指 offer 题目的理解,另一方面也想将所有题目整合在一起方便大家参考。

Newin2020的博客 2252

剑指 Offer 46. 把数字翻译成字符串

LeetCode: 剑指 Offer 46. 把数字翻译成字符串 递归回溯 1.1 先是 +1 遍历每一位数 1.2 之后从后往前 +2 的形式拼接成两位数 动态规划 >> 没想到 递归回溯 想到了递归回溯,但不知道怎么下手, 确实没有想到这样的写法。 int ans = 0; public int translateNum(int num) { String s = String.valueOf(num); dfs(s,

lankerens 389

leetcode 剑指offer-46.把数字翻译成字符串

原题如下: https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/ 2020年6月9日 每日一题 题解 方法一: 当我们考虑单个数字的时候,就只有一种翻译的结果,重要的是,我们遇到连续两个字母也可以翻译成字母,那么我们不妨建立一个数组ans[l+1],l为数字长度,来记录前n位的数字可以组成的答案种类,数组长度为数字长度多1,很明显ans[0]=ans[1]=1;我们从ans[2]来开始考虑,其实也是考虑一般状况下

zhuruihe2014的博客 250

剑指 Offer 46 把数字翻译成字符串

剑指 Offer 46 把数字翻译成字符串 题目链接 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 典型的 DP~ 我们用 dp[i]dp[i]dp[i] 记录前 iii 个数的最多翻译方法,对当前位置 iii,有如下的状态转移方程: dp[i]+=dp[i−1]dp[i]+=

旺崽的博客 2594

【剑指Offer】个人学习笔记_46_把数字翻译成字符串

目录题目:[剑指 Offer 46. 把数字翻译成字符串](https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/)题目分析初始解答:学习他人:方法一:方法二:方法三:方法四:总结 刷题日期:下午7:13 2021年5月11日星期二 个人刷题记录,代码收集,来源皆为leetcode 经过多方讨论和请教,现在打算往Java方向发力 主要答题语言为Java 题目: 剑指 Offer 46. 把数字翻译成字符串 难度中

苏柒的博客 453

leetcode 剑指 Offer 46. 把数字翻译成字符串

剑指 Offer 46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", "bw...

Lucky小黄人的博客 150
上一篇: 剑指Offer(第二版)面试题44:数字序列中某一位的数字
下一篇: 剑指Offer(第二版)面试题47:礼物的最大价值
xy_cpp
博客等级 码龄10年 119粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值