zoukankan      html  css  js  c++  java
  • 剑指46 把数字转化成字符串

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

    示例 1:

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

    一看就符合递归的思路,但是这题和斐波那契一样,递归都会导致反复求解重复的子问题。这种问题应该采用自底向上的循环方法。

    对于每个位置,如果他和下一个数组合起来可以被翻译为字符,那么从这个数往后的部分可以翻译的方法ans[n]=ans[n+1]+ans[n+2]

    注意判断的时候,一般会采用计算n和n+1的组成的数字的值是否大于25来判断,但是注意当num[n]为0的时候,和也会小于25,但是不能被组合起来翻译。

     1 class Solution {
     2 public:
     3     int translateNum(int num) {
     4         if(num<0)
     5             return 0;
     6         if(num<10)
     7             return 1;
     8         int len=0,origin=num;
     9         while(num!=0){
    10             len++;
    11             num/=10;
    12         }
    13         char chnum[len+1];
    14         sprintf(chnum,"%d",origin);
    15         int ans[len+1];
    16         ans[len-1]=1;
    17         if(chnum[len-2]!='0')
    18             ans[len-2]=(chnum[len-2]-'0')*10+(chnum[len-1]-'0')>25?1:2;
    19         else
    20             ans[len-2]=ans[len-1];
    21         cout<<len<<endl;
    22         for(int index=len-3;index>=0;index--){
    23             if(chnum[index]=='0'){
    24                 ans[index]=ans[index+1];
    25                 continue;
    26             }
    27             ans[index]=(chnum[index]-'0')*10+(chnum[index+1]-'0')>25?ans[index+1]:ans[index+1]+ans[index+2];
    28         }
    29         return ans[0];
    30 
    31     }
    32 };
  • 相关阅读:
    Android虚拟、实体键盘不能同时使用?
    libwebsockets 运行问题
    Qt TabWidget QTabBar 宽高设置
    I.MX6 recovery mode hacking
    libwebsockets libwebsockets-webserver.c hacking
    MySQL(六)常用语法和数据类型
    MySQL(五)汇总和分组数据
    MySQL(四)字段及常用函数
    MySQL(三)用正则表达式搜索
    MySQL(二)数据的检索和过滤
  • 原文地址:https://www.cnblogs.com/rookiez/p/13245816.html
Copyright © 2011-2022 走看看