字符串大数相加:从初稿到优化的思路演进

字符串大数相加:从初稿到优化的思路演进

在面试中,经常会遇到这样一道经典题目:

给定两个字符串形式的非负整数 num1num2,返回它们的和(结果也要用字符串表示)。
要求 :不能使用 BigInteger,也不能直接将字符串转成数字类型。

例如:

  • 输入:num1 = "123", num2 = "456"
  • 输出:"579"

核心还是模拟竖式加法,但实现上更「稳健」:

  1. 使用两个指针 ij 从尾部往前遍历;
  2. 每一位取值时注意下标是否越界,不够的补 0;
  3. 每一轮相加时都加上 carry
  4. 当前结果 = (x + y + carry) % 10,新的进位 = (x + y + carry) / 10,这是进位计算比较快的方式,也可以用单独的变量处理进位,但相对会麻烦一些;
  5. 最后别忘了反转字符串,因为刚开始添加是从后到前的。

3. 最终代码

java 复制代码
public class AddStrings {
    public static String addStrings(String num1, String num2) {
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        int carry = 0; // 进位
        StringBuilder sb = new StringBuilder();

        while (i >= 0 || j >= 0 || carry > 0) {
           // 平常用不到可能注意不到,所以写完需要测试下,顺手直接写成(int)num1.charAt(i--)结果是错误的
            int x = (i >= 0) ? num1.charAt(i--) - '0' : 0;
            int y = (j >= 0) ? num2.charAt(j--) - '0' : 0;

            int sum = x + y + carry;
            sb.append(sum % 10);   // 当前位
            carry = sum / 10;      // 更新进位
        }

        return sb.reverse().toString();
    }

    public static void main(String[] args) {
        System.out.println(addStrings("123", "456"));  // 579
        System.out.println(addStrings("99", "9"));     // 108
        System.out.println(addStrings("0", "0"));      // 0
    }
}

注:字符与数字的区别

在字符串加法中,最容易犯的错误就是直接把字符 (char) 转换成整型 (int)

  • char 类型存储的是 字符的编码值(ASCII/Unicode),而不是数字本身。

  • 例如:

    java 复制代码
    System.out.println((int)'3');   // 输出 51
    System.out.println('3' - '0');  // 输出 3
  • 因此,正确的做法是用 'c' - '0' 将字符 '0' ~ '9' 转换为对应的 整数 0 ~ 9


✅ 总结:思路没问题,细节要打磨。面试官更看重你发现问题、改进问题的能力。

相关推荐
froginwe1110 小时前
Foundation 顶部导航栏详解
开发语言
沐知全栈开发10 小时前
MySQL 运算符详解
开发语言
weixin_4083180410 小时前
教育行业直播系统搭建指南
java·大数据·数据库
小宋102111 小时前
Tycoon AI 新手快速上手指南
java·大数据·人工智能
java修仙传11 小时前
Java 实习日记:断面分析基态限额为空问题的排查与修复
java·开发语言·bug·实习
吴佳浩11 小时前
现代多模态大模型的核心基础:Unified Self-Attention
人工智能·算法·llm
日取其半万世不竭11 小时前
Linux 云服务器磁盘扩容:从分区到文件系统的完整流程
java·linux·服务器
njsgcs11 小时前
我仓库内cad python 有哪些应用到聚类的方法
开发语言·python·聚类
web3.088899911 小时前
电商数据化运营:速卖通API+Python打造竞品监控与选品利器
开发语言·python
小小编程路11 小时前
C++ 常用逻辑运算符
开发语言·c++·算法