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

题目:

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

 

示例 1:

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

 

提示:

  • 0 <= num < 231

代码:

复制代码
 1 //采用回溯法,选择的是子集树+递归,因为存在1位或者2位转换,所有有两种可能性
 2 class Solution {
 3     static int count=0;
 4     static StringBuilder sb=null;
 5     public int translateNum(int num) {
 6         count=0;
 7         String s=String.valueOf(num);
 8         sb=new StringBuilder();   //这是为了统计所有的字符串,题目不要求可以不写,所有sb行都可删除
 9         fun(s,0);
10         return count;
11     }
12     
13     public void fun(String s,int t){
14         int len=s.length();
15         if(t>=len){
16          count++;
17         } else{
18             //第一种可能性,必然存在,无需判断
19               sb.append((char)((s.charAt(t)-'0')+97));
20               fun(s,t+1);
21               sb.deleteCharAt(sb.length()-1);
22               //第二种可能性,第一位不为0且两位小于26,也可以转换   
23               if(t<len-1&&s.charAt(t)!='0'){
24                   int i=s.charAt(t)-'0';
25                   int j=s.charAt(t+1)-'0';   //数值变字符,1+'0'即可,0的码值为48,也可1+48变成'1';
26                   if(i*10+j<26){
27                       sb.append((char)((i*10+j)+97));  //数值变字符,A的码值为65,a的码值为97;此处(i*10+j)+'a')也可以
28                       fun(s,t+2);  //已转换2位,所以t+2
29                       sb.deleteCharAt(sb.length()-1);
30                   }
31               }
32         }
33     }
34 }
复制代码

 

posted @   堤苏白  阅读(44)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示