用数组下标代替键实现字符计数最高效:ASCII字符(0–127)直接转整数作索引,声明int[128]数组并遍历累加count[c]++,建议添加c>=0&&c
直接用数组下标代替键,是字符计数最轻量、最高效的方式之一。核心在于:把字符本身“转成数字”,作为数组索引去累加——不依赖哈希表,没有装箱开销,缓存友好,一行逻辑清晰。
ASCII 全范围映射(0–127)
标准 ASCII 字符共 128 个(0 到 127),可直接用字符的整数值作下标:
- 声明 int[] count = new int[128],初始化全为 0
- 遍历字符串每个 char c,执行 count[c]++(Java/C++ 中 char 可自动转 int)
- 安全起见,建议加判断 if (c ,跳过扩展 Unicode 字符
适用场景:纯英文文本、日志、命令行输入等已知无中文/emoji 的环境。
字母压缩映射(26 位小写)
若只关心英文字母,无需浪费 128 个位置,26 位足矣:
- 声明 int[] count = new int[26]
- 对每个字符先转小写:char lower = Character.toLowerCase(c)
- 计算索引:int idx = lower - 'a',再检查 idx >= 0 && idx
这样 count[0] 对应 'a',count[4] 对应 'e',空间降为 1/5,访问局部性更好。
大小写+数字分组映射(62 位)
需区分大小写字母和数字时,可手动分区,提升语义清晰度:
- 建长度 62 的数组:int[] count = new int[62]
- 映射规则:
• 'a'–'z' → 索引 0–25
• 'A'–'Z' → 索引 26–51
• '0'–'9' → 索引 52–61
• 计算示例:'Z' → 'Z'-'A'+26 = 51,'5' → '5'-'0'+52 = 57
比全 ASCII 节省近半内存,且逻辑明确,便于后续按类汇总或条件过滤。
注意事项与边界处理
该方法高效但有前提,务必确认输入可控:
- 不适用于任意 Unicode 字符(如中文“你”码点是 20320,开 20321 长度数组极不现实)
- 遇到空格、换行、标点等非目标字符,跳过即可,无需额外存储
- C++ 中 str[i] - 'a' 若 str[i] 是大写或非字母,结果可能为负——必须校验范围
- Java 中 char 是无符号 16 位,但用于索引时仍需防越界,尤其做减法后
本质上,这是用“确定性偏移”替代“哈希查找”,快在确定,限在确定。










