• 剑指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 };
  • 相关阅读:
    让你彻底明白什么叫游戏引擎(1)
    今后几年将有多于28部游戏电影面世
    Symbian系统体系结构
    让你彻底明白什么叫游戏引擎(2)
    网易程序笔试题
    [转贴]暴雪的霸王条款是否合理?
    CPU GPU设计工作原理《转》
    求伯君:向暴雪学习 金山不求一夜暴富
    我的职业规划
    网络游戏程序员新手入门 [转]
  • 原文地址:https://www.cnblogs.com/rookiez/p/13245816.html
Copyright © 2020-2023  润新知