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

来源:互联网 发布:美工网 编辑:程序博客网 时间:2024/04/20 15:44

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

题目:

给一个数字串,比如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;}