美文网首页
面试题46: 把数字翻译成字符串

面试题46: 把数字翻译成字符串

作者: 潘雪雯 | 来源:发表于2020-05-04 17:48 被阅读0次

    题目

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

    解题思路

    1. 从最小的子问题开始自下而上解决问题,从而消除重复的子问题。即从数字的末尾开始,然后从右往左翻译并计算不同翻译的数目。
    2. 将第i位和第i+1位两位数字拼接起来的数字在10~25的范围内的,翻译次数增加。但此时应注意i应该在 0~length-2的范围内,不然就会出现重复子问题。
    3. 若最后两位拼接之后值在10~25的范围内,则count+1。其他情况count += counts[i+2],因为其他情况时,后一位元素用来拼接,只能找后一个元素对应的上一次元素时的翻译次数。并在此基础上增加。换句话说就是中间元素复用两次。比如:counts[4]=1,count[3]=1此时coverted=58;counts[2]=2,此时coverted=25。也就是计算counts[2]的时候不能考虑count[3]这种情况(复用5)。

    代码

    class Solution
    {
        public:
            int GetTranslationCount(const string& number)
            {
                int length = number.length();//字符串长度
                int* counts= new int[length];//开辟长度为5的内存空间
                int count = 0;
                for(int i = length-1;i>=0;--i) //自下而上
                {
                    count = 0;
                    if(i < length-1)
                    {
                        count = counts[i+1];
                    }
                    else{
                        count = 1;
                    }
                    if(i<length-1)
                    {
                        int digit1 = number[i]-'0';
                        int digit2 = number[i+1]-'0';
                        int converted = digit1*10 + digit2;
                        if(converted >=10 && converted <= 25)
                        {
                            if(i < length-2)
                            {
                                count += counts[i+2];
                            }
                            else
                            {
                                count += 1;
                            }
                            cout << "第" << i << "轮count的值: " << count << endl;
                            cout << "digit1:" << digit1 << " digit2:" << digit2 << " converted:" << converted << endl;
                        }
                    }
                    counts[i] = count;
                }
                count = counts[0];
                delete[] counts;
                return count;
            }
    
             int GetTranslationCount(int num)
             {
                 if(num < 0)
                 {
                     return 0;
                 }
                 string numInString = to_string(num);
                 return GetTranslationCount(numInString);
             }
    };
    

    完整代码见GitHub

    相关文章

      网友评论

          本文标题:面试题46: 把数字翻译成字符串

          本文链接:https://www.haomeiwen.com/subject/radyghtx.html