
本文介绍如何修改字母索引求和程序,使其对大小写字母一视同仁——通过预处理将输入字符串统一转为小写,再查表计算“幸运和”,确保 "adam" 与 "adam" 得到完全相同的索引序列和总和结果。
本文介绍如何修改字母索引求和程序,使其对大小写字母一视同仁——通过预处理将输入字符串统一转为小写,再查表计算“幸运和”,确保 "adam" 与 "adam" 得到完全相同的索引序列和总和结果。
在当前实现中,alphabet = " abcdefghijklmnopqrstuvwxyz" 仅包含小写字母(首字符为空格占位,使 'a' 对应索引 1),因此调用 indexOf(ch) 时,大写字母(如 'A')无法匹配,返回 -1,导致计算错误和逻辑中断。根本解决思路不是扩充 alphabet 字符串(如添加大写字母),而是消除大小写差异本身——即在查表前统一标准化输入。
最简洁、高效且符合 Java 最佳实践的方式是:在进入循环前,将输入字符串整体转换为小写。String.toLowerCase() 方法安全可靠,能正确处理 ASCII 字母及多数 Unicode 字符(在默认 Locale 下),且不影响空格、数字或符号(本例中仅需处理字母)。
以下是优化后的完整方法实现:
public static void alphaSum(String word) {
String lowerCaseWord = word.toLowerCase(); // ✅ 关键预处理:统一转小写
String alphabet = " abcdefghijklmnopqrstuvwxyz"; // 索引表保持不变
int add = 0;
for (int i = 0; i < lowerCaseWord.length(); i++) {
char ch = lowerCaseWord.charAt(i);
int x = alphabet.indexOf(ch); // 此时 ch 必为小写或非字母字符
System.out.println(ch + " " + x);
add += x;
}
System.out.println("********************");
System.out.println("Lucky Sum: " + add);
}✅ 效果验证:
- 输入 "adam" → 输出:a 1, d 4, a 1, m 13 → Lucky Sum = 19
- 输入 "Adam" → 转小写后为 "adam" → 同样输出 a 1, d 4, a 1, m 13 → Lucky Sum = 19
⚠️ 注意事项:
- toLowerCase() 是无副作用操作,原字符串 word 不会被修改;
- 若需支持国际化(如土耳其语特殊规则),可显式传入 Locale.ROOT 避免 Locale 敏感行为:word.toLowerCase(Locale.ROOT);
- 当前 alphabet 中空格占索引 0,若输入含空格、标点等非字母字符,indexOf() 将返回 0 或 -1,建议根据业务需求决定是否过滤(例如 if (x > 0) add += x;);
- 此方案时间复杂度仍为 O(n),无额外空间开销(除一个新字符串引用),性能与可读性兼备。
总结:大小写不敏感的字符映射,首选「输入标准化」而非「扩大匹配集」。一行 toLowerCase() 即可彻底解耦字母形态与业务逻辑,是健壮、可维护的工程化选择。










