だから私は独学で C++ を学ぼうと思ったのですが、言語に問題はないように見えますが、率直に言って私は愚かです。
だから私の考えはこれでした。a=1、b=2、z=26、aa=27 などと言うと、単語を数値にマッピングし、ハッシュ テーブルでブール値を使用し (もちろんビット マスク)、O(1) スペル チェッカーを使用できます。なので、書いても全く問題ありません。それを行う私のアルゴリズムは次のようになります。
int pos;
word_key_t char_key;
word_key_t key = 0;
const char *raw = word.c_str();
cout << "Entering getKey loop with " << raw << endl;
for (pos = 0; raw[pos] != '\0'; pos++) {
if (raw[pos] >= 'A' && raw[pos] <= 'Z') {
char_key = raw[pos] - 'A';
} else if (raw[pos] >= 'a' && raw[pos] <= 'z') {
char_key = raw[pos] - 'a';
} else {
throw new runtime_error("Unrecognised Character");
}
key += (char_key + 1) * (pow(CHARS_IN_ALPHABET, pos));
}
cout << "word: " << raw << " ,score: " << key << endl;
return key;
動作するように見えますが、
a=1 b=2 ab=53 ac=79.
これは正しいと思います。
ただし、デコードしようとすると問題が発生します。これは私の最善の試みであり、うまくいきません。pow(26,position) を使用して文字列の末尾からデクリメントする必要があると思いますが、これを達成するのに苦労しています。これは、間違ったことを行う実行可能なスタンドアロン コードです。
#include <iostream>
#include <inttypes.h>
#include <string.h>
typedef uint32_t word_key_t;
const int CHARS_IN_ALPHABET = 26;
const int BUFFER_SIZE = 255; //ignore this for now.
using namespace std;
string reverseKey(const word_key_t key); //broken algo
int main(int argc, char** argv) {
reverseKey(53); // 53 = ab
return 0;
}
//disassemble a word_key_t into it's original string. returns lowercase only
string reverseKey(const word_key_t key)
{
char chr, buffer[BUFFER_SIZE];
word_key_t keyc = key, isolated, pos = BUFFER_SIZE;
cout << "key: " << keyc << endl;
while (keyc != 0) {
isolated = (keyc - 1) % ((word_key_t)CHARS_IN_ALPHABET + 1);
cout << "key: " << keyc << ", isolated: " << isolated << endl;
chr = (char)'a' + isolated - 1;
cout << "isolated character: " << chr << endl;
keyc = (keyc - isolated) / CHARS_IN_ALPHABET;
cout << "new key: " << keyc << endl;
pos++;
}
string s("test");
return s;
}
誰かがこれを解決するための正しい擬似コードに向けて私を微調整できれば、私は本当に感謝しています. 私は少し頭がおかしくなり、ソリューションでプロットを失いました。私はそれを見ることができません。何かが私に 2logX / 2log26 を教えてくれているので、もっと賢い目が必要だと思います。その後、C++ の学習に戻ることができます。`ここにコードを入力してください