本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目 

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

思路

  看到题目,很容易想到使用递归:用f(i)来表示从第i位开始的不同翻译数目,可以得到有:f(i)=f(i+1)+g(i,i+1)*f(i+2)。i和i+1位数字拼起来在10~25范围内时g(i,i+1)的值为1,否则为0。

  但是存在重复的子问题,所以递归并非最佳方法,我们从数字的末尾开始计算f(i),自下而上解决问题,就可以消除重复的子问题了。先算f(len-1),f(len-2),再根据公式f(i)=f(i+1)+g(i,i+1)*f(i+2)往前逐步推导到f(0),这就是最终要求的结果。

 

测试算例 

  1.功能测试(1个数字;多个数字)

  2.特殊测试(负数,0,含25、26等)

Java代码

//题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻
//译成"b",……,11翻译成"l",……,25翻译成"z"。一个数字可能有多个翻译。例
//如12258有5种不同的翻译,它们分别是"bccfi"、"bwfi"、"bczi"、"mcfi"和
//"mzi"。请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。 public class TranslateNumbersToStrings {
public int getTranslationCount(int number) {
if(number<0)
return 0;
String sNumber=String.valueOf(number);
int len=sNumber.length();
int[] counts=new int[len];
for(int i=len-1;i>=0;i--) {
if(i==len-1) {
counts[i]=1;
}else {
counts[i]=counts[i+1];
if(canBeTrans(sNumber,i)) {
if(i==len-2)
counts[i]+=1;
else
counts[i]+=counts[i+2];
}
}
}
return counts[0];
} private boolean canBeTrans(String sNumber, int i) {
int a=sNumber.charAt(i)-'0';
int b=sNumber.charAt(i+1)-'0';
int convert=a*10+b;
if(convert>=10 && convert<=25)
return true;
return false;
} public static void main(String[] args) {
TranslateNumbersToStrings demo= new TranslateNumbersToStrings();
System.out.println(demo.getTranslationCount(0)==1);
System.out.println(demo.getTranslationCount(10)==2);
System.out.println(demo.getTranslationCount(12258)==5);
System.out.println(demo.getTranslationCount(-100)==0);
}
}

  

收获

  1.递归方法,我们试着用公式描述会比较清晰

  2.递归是自上而下解决问题,如果遇到重复的子问题时,考虑自下而上求解,不用递归

  3.g(i,i+1)不仅要判断<=25,还要判断>=10,别漏了

更多:《剑指Offer》Java实现合集  

  

最新文章

  1. springboot: mybatis集成参考
  2. Activiti工作流引擎参考资料
  3. .Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇
  4. redis master配置了密码进行主从同步
  5. new-nav-js
  6. 【JavaScript】关于prototype原型的一些链接
  7. Form.KeyPreview 属性
  8. Oracle Golden Gate - 概念和机制 (ogg)
  9. MySQL学习笔记(5)
  10. javascript每日一练(八)——事件三:默认行为
  11. github 更新fork分支
  12. javaweb中的关于编码问题总结
  13. mybatis之Mybatis_demo
  14. tomcat 与 nginx,apache的区别
  15. 将nginx添加至service服务
  16. 前端 --- 5 BOM 和 DOM
  17. ntp开机无法自启
  18. 微信小程序如何玩转分销
  19. android破解
  20. [SpringBoot] - 配置文件的多种形式及优先级

热门文章

  1. IT阅读——关于“业务”
  2. 关于cc -o命令
  3. mysql 案例~关于pt-osc工具的用途
  4. jquery选择器最后一个,倒数第二个元素
  5. SpringBoot处理静态资源的两种方式
  6. java web path
  7. 生产环境elasticsearch5.0.1和6.3.2集群的部署配置详解
  8. zabbix常见报错问题处理
  9. python安装虚拟环境pipenv
  10. 微信支付之JsApi支付