字符串所有数字加1功能异常求助(输入129、9923结果不符)
字符串每位数字加1的代码问题排查与修正
原代码的核心问题
String.replace()的误用:这个方法会替换字符串中所有匹配的字符,比如输入"9923"时,处理最后一位9改成0后,前面的9也会被一并替换,完全不符合逐位处理的需求。- 进位逻辑混乱:手动修改循环变量
i会导致跳过部分字符,而且计算前一位时,before + carry属于重复累加(before已经加了1,再加carry=1等于多算了一次)。 - 未同步更新后的字符:处理过程中始终从原始字符串
number取字符,没有用已经修改后的result,导致后续处理基于旧值,出错概率极高。
修正后的实现方案
正确的思路是把字符串转为字符数组,从后往前逐位处理,维护进位状态,最后处理剩余进位:
import java.util.*; public class Increment { public static void main(String[] args) { String number = "129"; // 可替换为"9923"测试 char[] digits = number.toCharArray(); int carry = 1; // 初始进位为1,等价于给每位数字加1 // 从后往前遍历每一位,有进位才继续处理 for (int i = digits.length - 1; i >= 0 && carry > 0; i--) { int current = digits[i] - '0'; int newDigit = current + carry; if (newDigit == 10) { digits[i] = '0'; carry = 1; } else { digits[i] = (char) (newDigit + '0'); carry = 0; } } // 处理遍历结束后仍有进位的情况(比如输入999) String result; if (carry == 1) { result = "1" + new String(digits); } else { result = new String(digits); } System.out.println(result); } }
关键说明
- 用字符数组操作可以精准修改每一位,彻底避免全局替换的问题。
- 统一用
carry变量管理进位,逻辑更清晰,不会出现重复累加的错误。 - 当进位为0时提前终止遍历,提升处理效率。
- 单独处理最终进位,覆盖所有边界场景(比如全9的字符串)。
内容的提问来源于stack exchange,提问作者Koushik Andhavarapu
相关产品推荐
相关产品推荐

