如何将字符串中每个字符的首次出现转换为大写形式
需求说明
给定任意小写组成的字符串(示例值"aabccdeef"),规则为每个字符的首次出现转换为大写,后续重复出现的字符保留小写,最终输出目标结果"AaBCcDEeF"。
实现思路
- 用标记位记录遍历过程中已经出现过的字符,避免重复判断
- 逐字符遍历原字符串,若当前字符未被标记过,转大写后加入结果集,同时标记该字符为已出现
- 若当前字符已经被标记过,直接保留小写形态加入结果集
- 选择高效的字符串拼接容器,减少不必要的性能损耗
Java 代码实现
public class StringConvertUtil { public static String firstOccurrenceToUpper(String source) { // 针对ASCII字符用数组做存在标记,查询效率O(1),轻量无额外装箱开销 boolean[] hasAppeared = new boolean[128]; StringBuilder resultBuilder = new StringBuilder(source.length()); for (char c : source.toCharArray()) { char lowerChar = Character.toLowerCase(c); if (!hasAppeared[lowerChar]) { // 首次出现,转大写追加 resultBuilder.append(Character.toUpperCase(c)); hasAppeared[lowerChar] = true; } else { // 非首次出现,保留小写追加 resultBuilder.append(lowerChar); } } return resultBuilder.toString(); } public static void main(String[] args) { String testInput = "aabccdeef"; // 执行转换 String output = firstOccurrenceToUpper(testInput); // 输出结果:AaBCcDEeF System.out.println(output); } }
逻辑说明
- 标记数组长度设为128是覆盖所有常用ASCII字符,相比
HashSet<Character>不需要做字符的装箱拆箱,性能更优 - 判断字符是否存在时统一转小写处理,可兼容原字符串混有大写字符的场景,不会出现同字母大小写被判定为不同字符的问题
- 初始化
StringBuilder时提前传入原字符串长度,避免内部数组动态扩容的开销 - 非首次出现的字符统一转小写追加,保证即使原字符串有大写的重复字符,最终输出也符合规则
内容的提问来源于stack exchange,提问作者Thonas1601
相关产品推荐
相关产品推荐

