Skip to content

Instantly share code, notes, and snippets.

@sing1ee
Last active December 24, 2015 05:09
Show Gist options
  • Save sing1ee/2ec999e94e8a217615fb to your computer and use it in GitHub Desktop.
Save sing1ee/2ec999e94e8a217615fb to your computer and use it in GitHub Desktop.

###翻译数字串分析

####原题 翻译数字串,类似于电话号码翻译:给一个数字串,比如12259,映射到字母数组,比如,1 -> a, 2-> b,... , 12 -> l ,... 26-> z。那么,12259 -> lyi 或 abbei 或 lbei 或 abyi。输入一个数字串,判断是否能转换成字符串,如果能,则打印所以有可能的转换成的字符串。动手写写吧。

####分析 转自@lxhgww 的一条微博“special thanks to @陈利人,找工作准备过程中,翻完你的3600多条微博,而且看完了所有的评论,收到了Microsoft和Google总部的offer,最终签约Google Mountain View”

首先要恭喜这位同学,我们能够帮助到这位同学,是我们莫大的荣幸,也是对我们待字闺中的最大的鼓励。我们会再接再厉,和同学们分享更多的题目。也希望同学们能够积极的参与进来,踊跃的讨论,各种思路进行碰撞,我们相信,不仅仅会对找工作有很大的帮助,对日常的工作也会有很大的促进的。

再一次恭喜这位同学!

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

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

  • 映射是在[1,26]这个范围内数字
  • 输入的字符串是否包括0或者负数?

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

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

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

  1. (12)259
  2. (122)59

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

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

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

【分析完毕】

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment