这是一道面试题:
Imagine an alphabet of words. Example:
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
注意:不允许暴力破解。这是问题的链接:http: //www.careercup.com/question?id=21117662
我可以将该解决方案理解为:
- 总字数为 2^26 -1。
- 对于给定的单词,大小小的单词首先出现。
- 设 n 为单词的长度,
- 大小小于 n 的单词总数为 C(26, 1) + C(26, 2) + ...+ C(26, n -1)
- 然后计算在给定单词之前有多少个大小相同的单词
- 两个数加一的和就是结果
参考:sites.google.com/site/spaceofjameschen/annnocements/printtheindexofawordwithlettersinascendingorder--microsoft
在示例解决方案中,我了解了作者如何计算大小小于 word.size() 的单词数。但是,在代码中,我不太确定如何找到与 word.size() 大小相同且出现在“word”之前的单词数。
准确地说,这一点:
char desirableStart;
i = 0;
while( i < str.size()){
desirableStart = (i == 0) ? 'a' : str[i - 1] + 1;
for(int j = desirableStart; j < str[i]; ++j){
index += NChooseK('z' - j, str.size() - i - 1); // Choose str.size() - i - 1 in the available charset
}
i ++;
}
有人可以帮我理解这一点吗?谢谢。