これはインタビューの質問です:
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)
- 次に、指定された単語の前に同じサイズの単語がいくつあるかを計算します
- 2 つの数値に 1 を加えた合計が結果です
参照: sites.google.com/site/spaceofjameschen/annnocements/printtheindexofawordwithlettersinascendingorder--microsoft
サンプル ソリューションでは、作成者が word.size() より小さいサイズの単語数を計算する方法を理解しました。しかし、コードでは、「word」の前に出現する word.size() と同じサイズの単語の数を見つける方法についてはあまりよくわかりません。
正確には、このビット:
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 ++;
}
誰かがこのビットを理解するのを手伝ってくれますか? ありがとう。