递归实现字符串隔位大小写转换结果不符问题求助
问题分析
你当前的递归逻辑错误在于依赖returned_str.length()判断字符位置,但递归是从后往前处理字符串,returned_str的长度是剩余子串的长度,无法对应原字符串中字符的真实索引位置。比如处理"Even"的第二个'e'时,returned_str.length()为1(对应"n"的长度),导致错误地将本应小写的'e'转为大写,最终得到"evEn"而非预期的"eVeN"。
解决方案
要实现正确的隔位大小写转换,核心是确定当前字符在原字符串中的索引位置,而非依赖子串处理后的长度。可以通过重载递归方法,将原字符串的总长度传入辅助函数,以此计算当前字符的索引:
public static String camelCaseRecursive(String w) { // 入口方法,传入原字符串和其总长度 return camelCaseHelper(w, w.length()); } private static String camelCaseHelper(String currentStr, int originalLength) { // 递归终止条件:空字符串直接返回 if (currentStr.isEmpty()) { return ""; } char currentChar = currentStr.charAt(0); // 计算当前字符在原字符串中的索引:原长度 - 当前子串长度 int currentIndex = originalLength - currentStr.length(); // 根据索引奇偶性转换大小写:偶数索引转小写,奇数索引转大写 if (currentIndex % 2 == 0) { currentChar = Character.toLowerCase(currentChar); } else { currentChar = Character.toUpperCase(currentChar); } // 递归处理剩余子串,拼接结果 return currentChar + camelCaseHelper(currentStr.substring(1), originalLength); }
逻辑说明
- 入口方法
camelCaseRecursive负责初始化,将原字符串和其总长度传入辅助递归方法。 - 辅助方法中,通过
originalLength - currentStr.length()计算当前字符在原字符串中的真实索引(从0开始)。 - 按需求转换大小写:偶数索引(0、2、4...)转小写,奇数索引(1、3、5...)转大写(可根据需求调整规则)。
- 递归处理剩余子串,将当前处理后的字符与子串处理结果拼接,最终返回完整字符串。
测试验证:
- 输入"Even",得到
eVeN,符合预期。 - 输入"Hello World",得到
hElLo wOrLd,符合预期。
内容的提问来源于stack exchange,提问作者Branto
相关产品推荐
相关产品推荐

