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

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

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

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

例如:

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

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

  1. 使用两个指针 i、j 从尾部往前遍历;
  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。


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

相关推荐
tommyjiatong20 小时前
什么是PHP漏洞
开发语言·php
荆棘鸟智能20 小时前
河道采砂船识别与轨迹追踪怎么做?检测、跟踪与电子围栏实战思路
人工智能·算法·目标检测
CodeYp201920 小时前
第19讲:封装红黑树实现 mymap 和 myset
开发语言·c++·红黑树
qq_3646821520 小时前
录音APP怎么切换语言?多语言版本如何使用
java·服务器·前端
Wang's Blog21 小时前
Java 项目实战: 交友项目 - 用户体系集成:根据环信id查询用户详情
java·lua·交友
摇滚侠21 小时前
《On Java 中文版 基础卷》阅读笔记 复用 13
java·笔记·python
2601_9689007721 小时前
玻璃深加工的工艺窗口:4 道工序的温度与时间参数边界
android·java·javascript
薛之谦_21 小时前
用 Java 实现阿里云式 IAM 子用户管理:架构设计与表结构详解
java·python·阿里云
DFT计算杂谈21 小时前
GSAS-II X 射线衍射(XRD)数据转换为对分布函数(PDF,Pair Distribution Function)
算法·机器学习·pdf
绕灵儿21 小时前
火灾检测-应用场景-YOLO训练记录
人工智能·算法