我在准备考试时遇到了以下问题:
想象一下单词的字母。例如:
a ==> 1
b ==> 2
c ==> 3
...
z ==> 26
ab ==> 27
ac ==> 28
...
az ==> 51
bc ==> 52
and so on.
字符序列只需要按升序排列(即'ab'有效但'ba'不是)。
问题:给定任何单词,如果有效则打印其索引,否则打印0。
Input Output
ab 27
ba 0
aez 441
任何关于如何解决这个问题的指示都将不胜感激。
答案 0 :(得分:7)
让我给你一些提示:
k
k
长度和一个字母l
。从k
开始,有多少长度为l
的单词?提示:Pascal三角形。如果您需要更多提示,http://en.wikipedia.org/wiki/Combinadic可以提供帮助。如果您需要一些实现,可以从(Python语言)https://github.com/sagemath/sagelib/blob/master/sage/combinat/choose_nk.py
中定义的rank函数中获得灵感答案 1 :(得分:2)
公平地说,我没有提到如何计算索引值的算法,只是退出案例。但它为您提供了正确方向的开端,计算索引将遵循相同的框架。
更多信息:
在第一个字母开始向上计数。当您点击“z”时,重置为下一个有效字符串并继续计数 - > “aa”失败不计算在内。添加到下一个这里是“ab”。一旦你点击“az”,尝试“ba” - 失败,继续添加字母,直到你得到一个有效的字符串“bc”并再次开始计数。这就像里程表上升。
D慢,但它应该工作,因为你手动做的是得到答案。 顺便说一下,@ hivert提出的更优雅的解决方案几乎可以立即计算......