所以我想我会自学 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++。`在此处输入代码