图解LeetCode——剑指 Offer 46. 把数字翻译成字符串

news2024/11/18 9:10:51

一、题目

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

二、示例

2.1> 示例 1:

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

提示:

  • 0 <= num < 2^31

三、解题思路

根据题目描述,我们要将数字翻译为字符串,那么对于一个数字来说,都可以找到一一相对应的字母;但是,如果是两个数字以上的话,就不一定了,针对数字12就有如下翻译方式:

1个数字翻译1次】1——>b,2——c;那么最终12可以被翻译为“bc”;
2个数字被翻译】那么最终12可以被翻译为“m”;

但是,如果两个数字超过了25,那么就无法被按照整体翻译了,只能一个数字翻译一次,以26为例:

2——>c;6——>g;那么最终26可以被翻译为“cg”;

通过上面的解释,大家其实可以看出一个解题思路,那就是把输入的数字进行“拆分”,看最终能合理拆分出多少种;

我们再继续分析,虽然一个数字有很多的“位”,但是其实每次进行合并后是否超过了25的对比行为都只涉及到两个相邻的数字,即:第i位与第i-1位,那么我们就可以通过这两位是否合并,来动态的计算出总的翻译结果了。具体请见下图所示,我们以输入:12258为例,看一下具体的对比过程。

看完上面的对比过程,我们就可以推导出动态转移公式了,即:

如果i可以与i-1合并】dp[i] = dp[i-1] + dp[i-2];
否则】dp[i] = dp[i-1];

四、代码实现

class Solution {
    String numStr;
    public int translateNum(int num) {
        numStr = String.valueOf(num);
        int n = numStr.length();
        if (n < 2) return 1;
        int[] dp = new int[n];
        dp[0] = 1;
        dp[1] = compare(1) ? 2 : 1;
        for (int i = 2; i < n; i++) dp[i] = compare(i) ? dp[i-1] + dp[i-2] : dp[i-1];
        return dp[n-1];
    }
    public boolean compare(int i) {
        return numStr.substring(i-1, i+1).compareTo("10")>=0 && 
            numStr.substring(i-1, i+1).compareTo("25") <= 0;
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/371685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring boot3 一、 spring alibaba cloud 整合 网关 nacos config

jm-apis服务jm-user-api用户服务jm-apis-common公共模块jm-apis-common-bean公共beanjm-apis-common-conf公共配置jm-apis-common-tool公共工具jm-dubbo-apisRPC服务jm-dubbo-user-api用户RPC服务 jianmu-springboot3-springalibabacloud pom.xml <?xml version"1.0&…

电容学习(1)

电解电容 是具有极性的电容&#xff1b; 电解电容的体积大&#xff0c;只有在需要较大容值的时候才需要&#xff1b; 缺点&#xff1a;电解电容容值不稳定&#xff0c;容易随着温度和其他参数变化而变化&#xff1b;因此相对来说非电解电容更稳点一些&#xff1b; 电容的公式&…

如何定制一个智能洒水装置(养狗/养花人士请进)

目录 如何用智能地教狗狗上厕所如何定制一个智能洒水装置 背景 上一篇文章中提到了&#xff0c;我实现了一个自动检测狗狗有没有进厕所的功能。现在我们家的狗狗用它那不算大的小脑瓜&#xff0c;已经百分百学会&#xff08;但是&#xff01;也不知道它是不是聪明过头了&…

非常好看的html网页个人简历

一. 前言 文末获取gitee链接 在前几天逛b站的时候&#xff0c;发现了个比较实用的东西-----个人简介网页版&#xff0c;相当于网页版的个人简历&#xff0c;相较于PDF形式的&#xff0c;网页版所能呈现内容更加丰富&#xff0c;而且更加美观&#xff0c;在BOOS上被HR小姐姐要…

FL Studio21MAC电脑中文升级版安装图文教程

FL Studio版本有很多,每个版本各有优点。除了最新版本外,还有历史经典版本,用户可以根据自己的需求进行下载,FL Studio21是一款功能十分丰富和强大的音乐编辑软件&#xff0c;能够帮助用户进行编曲、剪辑、录音、混音等操作&#xff0c;让用户能够全面地调整音频&#xff0c;软…

2288hv5超融合服务器 数码管报888

【问题现象】 2288hv5超融合服务器&#xff0c;前面板数码管报888&#xff0c;电源灯黄灯闪烁&#xff0c;开不了机&#xff0c;ibmc网络是通的&#xff0c;但是web网页打不开 【问题原因】 iBMC的版本过低&#xff0c;iBMC在智能诊断数据库保护机制存在异常&#xff0c;导…

【算法笔记】前缀和与差分

第一课前缀和与差分 算法是解决问题的方法与步骤。 在看一个算法是否优秀时&#xff0c;我们一般都要考虑一个算法的时间复杂度和空间复杂度。 现在随着空间越来越大&#xff0c;时间复杂度成为了一个算法的重要指标&#xff0c;那么如何估计一个算法的时间复杂度呢&#xf…

数据库浅谈之共识算法

数据库浅谈之共识算法 HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是数据库浅谈系列&#xff0c;收录在专栏 DATABASE 中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列阿呆将记录一些数据库领域相关的知识 &#x1…

Linux SELinux讲解

目录 SELinux概念 SELinux配置文件 SELINUX 工作模式 SELINUX TYPE策略类型 配置安全上下文 查看安全上下文 修改安全上下文 修改默认的安全上下文 配置策略规则 查看策略规则 修改策略规则状态 SELinux概念 为什么提出SELinux 之前学习的权限&#xff0c;都是基于用…

深力科电子-MachXO2系列 前所未有的灵活桥接和I/O扩展功能 LCMXO2-256HC-4TG100C FPGA现场可编程门阵列

lattice莱迪斯MachXO2系列超低密度FPGA现场可编程门阵列&#xff0c;适用于低成本的复杂系统控制和视频接口设计开发&#xff0c;满足了通信、计算、工业、消费电子和医疗市场所需的系统控制和接口应用。 瞬时启动&#xff0c;迅速实现控制——启动时间小于1mS&#xff0c;在上…

FreeRTOS信号量

前面介绍过&#xff0c;队列&#xff08;queue&#xff09;可以用于传输数据&#xff1a;在任务之间&#xff0c;任务和中断之间。消息队列用于传输多个数据&#xff0c;但是有时候我们只需要传递一个状态&#xff0c;这个状态值需要用一个数值表示&#xff0c;比如&#xff1a…

Android运行时权限Runtime Permission源码分析

Runtime Permission源码跟踪 Android 8.1.0 请求权限时弹窗代码 应用使用requestPermissions申请权限时&#xff0c;系统会弹出一个选择窗口&#xff0c;可进行允许。 源码在packages/apps/PackageInstaller/文件下 GrantPermissionsActivity.java是进行权限分配的弹出窗口…

分布式之PBFT算法

写在前面 在分布式之拜占庭问题 一文中我们分析了拜占庭问题&#xff0c;并一起看了支持拜占庭容错的口信消息性和签名消息性算法&#xff0c;但是这两种算法都有一个非常严重的问题&#xff0c;就是消息数量太多&#xff0c;通信的成本太大&#xff0c;消息数量复杂度为O(n ^…

CentOS 环境 OpneSIPS 3.1 版本安装及使用

文章目录1. OpenSIPS 源码下载2. 工具准备3. 编译安装4. opensips-cli 工具安装5. 启动 OpenSIPS 实例1. OpenSIPS 源码下载 使用以下命令即可下载 OpenSIPS 的源码&#xff0c;笔者下载的是比较稳定的 3.1 版本&#xff0c;读者有兴趣也可前往 官方传送门 sudo git clone htt…

1个串口用1根线实现多机半双工通信+开机控制电路

功能需求&#xff1a; 主机使用一个串口&#xff0c;与两个从机进行双向通信&#xff0c;主机向从机发送数据&#xff0c;从机能够返回数据&#xff0c;由于结构限制&#xff0c;主机与从机之间只有3根线&#xff08;电源、地、数据线&#xff09;&#xff0c;并且从机上没有设…

【蓝牙mesh】access层(接入层)协议介绍

【蓝牙mesh】access层&#xff08;接入层&#xff09;协议介绍 Access层简介 Access层定义了应用层如何使用upper协议层的接口&#xff0c;它不仅定义了应用层的格式&#xff0c;还定义了应用数据在upper层的加密和解密。当收到下层的数据包时&#xff0c;它会检查数据的netke…

Web前端:选择AngularJS进行Web开发的12大理由!

无论你希望构建本地应用程序、渐进式web应用程序(PWA)&#xff0c;还是开发单页应用程序&#xff0c;每个企业都寻求具有影响力的数字形象&#xff0c;并希望构建交互式、跨平台和动态的web应用程序&#xff0c;以吸引客户。AngularJS&#xff0c;也称为Angular&#xff0c;是一…

李宏毅2023春季机器学习课程

目录2021&2022课程重磅须知我维护的其他项目更新日志课程地址课程资料直链课程作业直链其他优质课程2021&2022课程 CSDN Github 重磅须知 为方便所有网课资料与优质电子书籍的实时更新维护&#xff0c;创建一个在线实时网盘文件夹&#xff1b;   网盘获取方式&#…

C++进阶——继承

C进阶——继承 1.继承的概念及定义 面向对象三大特性&#xff1a;封装、继承、多态。 概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特 性的基础上进行扩展&#xff0c;增加功能&#xff0c;这…

MySql数据库环境部署

MySql基础与Sql数据库概述基础环境的建立MYSQL数据库的连接方法MySql的默认数据库数据库端口号数据库概述 数据库&#xff08;DataBase&#xff0c;DB)∶存储在磁带、磁盘、光盘或其他外存介质上、按定结构组织在一起的相关数据的集合。数据库管理系统〈DataBase Management S…