翻译数字串分析---待字闺中面试题

翻译数字串分析---待字闺中面试题

题目:

给一个数字串,比如12259,映射到字母数组,比如,1 -> a, 2-> b,... , 12 -> l ,... 26-> z。那么,12259 -> lyi 或 abbei 或 lbei 或 abyi。输入一个数字串,判断是否能转换成字符串,如果能,则打印所以有可能的转换成的字符串。

思路:

开始今天的分析。这个题目是一个比较直接,比较简单的题目。面试官会出这样的题目,一般都是考察大家的coding的功力的。这个实话实说,真的没有捷径。就是多写、多练,也可以阅读优秀的代码,不断的体会思路。

我们这里来分析一下这个题目的分析思路。看完这个描述,我们应该注意到一下的细节:

  • 映射是在[1,26]这个范围内数字

  • 输入的字符串是否包括0或者负数?

这些细节要注意,不明确的要咨询面试官,要不然,很容易让你的程序出现漏洞。面试官也比较在意这个交互的过程。

充分理解题目的含义、目的之后,很直接的就可以想到这个题目可以用递归解决。如原题中的例子:12259,它有两个递归的子问题,(1)2259和(12)259,前面的括号表示是否能够通过映射表翻译。同理每一个子问题,都会表示为这样的两个子问题。

接下来,我们考虑(1)2259的两个子问题:

  1. (12)259

  2. (122)59

大家有注意到,第一个和12259的一个子问题重复了。大家是否对这个似曾相识呢?当大家把递归过程的树形结构画出来,会发现更多的重复子问题,这就给了我们改进的空间,只需要取消这些重复计算就可以了。

第一个方法就是记忆法,将计算过的结果缓存起来,这样可以后续接着使用。但是更近一步,我们是可以采用动态规划的方法的。很多同学也都直接的想到了。

上面的过程,是为初学者指的路,希望能对大家有所帮助。但还有一个细节,大家要注意,这个题目不仅仅是判断是否可以,还需要打印出来所有的情况。这个细节要在编程的时候注意。

代码为:

#include <iostream>
using namespace std;

void digit_to_character(char* s, char* new_s, int idx)
{
    if((s == NULL) || (*s == '\0'))
    {
        new_s[idx] = '\0';
        cout << new_s << endl;
        return;
    }

    new_s[idx++] = (*s - '1' + 'a');
    digit_to_character(s+1, new_s, idx--);

    if(*(s+1) == '\0')
    {
        return;
    }
    int first_two = (*s - '0') * 10 + (*(s+1) - '0');
    if(first_two <= 26)
    {
        new_s[idx++] = (first_two - 1 + 'a');
        digit_to_character(s+2, new_s, idx--);
    }
}


void digit_character_mapping(char* s)
{
    int len = strlen(s);
    for(int i = 0; i < len; ++i)
    {
        if( (s[i]<'1') || (s[i] > '9') )
        {
            cout << "Invalid input!" << endl;
            return;
        }
    }

    char* new_s = (char*)malloc(len*sizeof(char) + 1);
    digit_to_character(s, new_s, 0);
    free(new_s);
}

int main()
{
    char s[] = "12259";
    digit_character_mapping(s);
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值