如何编写Java方法实现仅对单独出现的元音字母加倍?
实现思路
- 核心规则确认:你需要加倍的「单独出现的元音」指的是连续相同元音的长度为1的情况,如果连续出现2次及以上相同元音则保持原样。如果你的需求是「元音前后没有其他任何元音才算单独」,可以调整对应的判断逻辑即可。
- 建议使用
StringBuilder做字符串拼接,相比直接对String做累加性能提升明显,也不会生成大量无用的中间字符串对象。 - 你提到的「统计连续相同字符数量」的思路完全可行,单次遍历即可完成:每次从当前下标开始,向后统计所有和当前字符相同的连续字符数量,再根据是否为元音、连续长度是否为1决定拼接逻辑,最后直接跳转下标跳过已处理的字符即可,不需要重复遍历。
修正后的实现代码
public static String doubleVowelsMaybe(String s) { // 空字符串直接返回 if (s == null || s.isEmpty()) { return s; } StringBuilder result = new StringBuilder(); int index = 0; int strLength = s.length(); while (index < strLength) { char currentChar = s.charAt(index); int continuousLen = 1; // 统计当前字符连续出现的次数 while (index + continuousLen < strLength && s.charAt(index + continuousLen) == currentChar) { continuousLen++; } // 判断是否为单独出现的元音 if (isVowel(currentChar) && continuousLen == 1) { // 单独元音加倍拼接 result.append(currentChar).append(currentChar); } else { // 其他情况原样拼接 result.append(String.valueOf(currentChar).repeat(continuousLen)); } // 跳过已经处理过的连续字符 index += continuousLen; } return result.toString(); } // 元音判断辅助方法示例,可按需调整大小写匹配逻辑 private static boolean isVowel(char c) { return "aeiouAEIOU".indexOf(c) != -1; }
适配你给出的示例的调整方案
如果你给出的输入beautiful输出beautiifuul是预期效果,说明你的「单独出现」规则是元音的前后字符都不是元音,只需要把上述代码中的逻辑替换为下方版本即可:
public static String doubleVowelsMaybe(String s) { if (s == null || s.isEmpty()) { return s; } StringBuilder result = new StringBuilder(); int strLength = s.length(); for (int i = 0; i < strLength; i++) { char current = s.charAt(i); if (isVowel(current)) { boolean prevIsVowel = i > 0 && isVowel(s.charAt(i - 1)); boolean nextIsVowel = i + 1 < strLength && isVowel(s.charAt(i + 1)); if (!prevIsVowel && !nextIsVowel) { // 前后都不是元音,单独出现的元音加倍 result.append(current).append(current); continue; } } // 非单独元音或非元音,原样拼接 result.append(current); } return result.toString(); }
内容的提问来源于stack exchange,提问作者Konnor Kivimagi
相关产品推荐
相关产品推荐

