求数字字符串连续相同数字迭代求和函数的递归实现方案
实现连续相同数字求和直到无连续重复的方法
需求回顾
实现方法 String consecutiveSum(String number):接收数字字符串,将所有连续相同的数字替换为它们的和,重复此过程直到字符串中不存在连续相同数字。比如输入 "144404331",处理流程是:"144404331" → "1120461"(合并3个4为12,2个3为6)→ "220461"(合并2个1为2)→ "40461"(合并2个2为4),最终返回 "40461"。
方案1:递归实现
思路直观:先完成一轮连续相同数字的合并,得到新字符串。如果新字符串和原字符串完全一致,说明没有可合并的内容,直接返回;否则递归调用方法处理新字符串。
public String consecutiveSum(String number) { // 先完成一轮连续相同数字的合并操作 StringBuilder sb = new StringBuilder(); int n = number.length(); if (n == 0) return ""; char current = number.charAt(0); int count = 1; for (int i = 1; i < n; i++) { if (number.charAt(i) == current) { count++; } else { // 计算当前连续数字的和,转为字符串追加 int sum = Character.getNumericValue(current) * count; sb.append(sum); current = number.charAt(i); count = 1; } } // 处理最后一组连续数字 int sum = Character.getNumericValue(current) * count; sb.append(sum); String result = sb.toString(); // 终止条件:处理后无变化则返回,否则递归继续处理 return result.equals(number) ? result : consecutiveSum(result); }
方案2:迭代实现(避免递归栈溢出)
如果输入字符串极端长,递归可能触发栈溢出,迭代方案更稳妥。核心逻辑和递归一致,用循环代替递归,直到某次处理后的字符串和处理前完全相同为止。
public String consecutiveSum(String number) { String currentStr = number; while (true) { StringBuilder sb = new StringBuilder(); int len = currentStr.length(); if (len == 0) return ""; char currentChar = currentStr.charAt(0); int count = 1; for (int i = 1; i < len; i++) { if (currentStr.charAt(i) == currentChar) { count++; } else { sb.append(Character.getNumericValue(currentChar) * count); currentChar = currentStr.charAt(i); count = 1; } } // 处理最后一组连续数字 sb.append(Character.getNumericValue(currentChar) * count); String nextStr = sb.toString(); if (nextStr.equals(currentStr)) { return nextStr; } currentStr = nextStr; } }
关键细节说明
- 合并时要将连续数字的和转为完整字符串追加(比如3个4的和是12,需追加"12"而非单个数字)
- 必须以「处理前后字符串完全一致」作为终止条件,否则会遗漏后续产生的连续重复(比如示例中第一次处理后出现的连续1)
内容的提问来源于stack exchange,提问作者Matthew Marion
相关产品推荐
相关产品推荐

