如何替代数组存储a-z对应2的幂次映射关系以便后续复用
解决方案
首先纠正你代码里的一个潜在问题:pow()是浮点运算函数,对于较大的指数可能出现精度丢失,用整数移位运算1 << exponent来计算2^exponent更可靠,而且效率更高。
关于存储映射关系,给你几个实用的方案:
方案一:无需存储,直接计算(最省心)
因为字母与指数的对应关系是固定的(a对应0,b对应1...z对应25),完全可以在需要取值时直接计算,不用提前存储:
// 获取任意字母对应的数值 char target_char = 'x'; int value = 1 << (target_char - 'a');
target_char - 'a'会得到0-25的指数,左移1位等价于乘以2,所以1 << exponent就是2^exponent。
方案二:用数组存储(其实非常简单)
你觉得数组会增加难度,但实际上这是最高效的存储方式——因为a-z的ASCII码是连续的,直接用索引对应字母即可:
int letter_map[26]; // 初始化数组 for (int exponent = 0; exponent < 26; exponent++) { letter_map[exponent] = 1 << exponent; } // 调用时取值 char target_char = 'm'; int value = letter_map[target_char - 'a'];
数组访问是O(1)的,比哈希表更快,代码也极简。
方案三:用哈希表存储(适合非连续字符场景)
如果执意不想用数组,可以用哈希表直接映射字符到数值,以C++为例:
#include <unordered_map> using namespace std; unordered_map<char, int> letter_map; // 初始化哈希表 for (char letter = 'a'; letter <= 'z'; letter++) { int exponent = letter - 'a'; letter_map[letter] = 1 << exponent; } // 调用时取值 char target_char = 'k'; int value = letter_map[target_char];
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

