【LeetCode笔记】415. 字符串相加(Java、字符串)

题目描述

  • 不能直接把字符串转换成整数(会溢出)
  • 面试被问过,今天刷面经又刷到。。那就索性水一篇文吧!
  • 更新:原题就是 leetcode 415
    在这里插入图片描述

思路 & 代码

  • 只要理好字符串s、字符串t、答案字符串的对应位关系就好啦!
  • 注意 carry 位的考虑:其中一个字符串已经结束时,也还需要考虑。
    加法结束后,还要考虑最后一次
  • 注意进行字符之间的加法的时候不要算乱了= =
  • 时间复杂度 O(max(m, n)),取两字符串的最大长度
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        int sL = s.length();
        int tL = t.length();
        int maxL = Math.max(sL, tL);
        // 从后往前,从小到大
        char[] ans = new char[maxL];
        int carry = 0;
        // 时间复杂度 O(max(m, n))
        for(int i = sL - 1, j = tL - 1; maxL > 0; i--, j--, maxL--){
            int nowSum = 0;
            // 一方先结束的情况
            if(i < 0){
                nowSum = t.charAt(j) - '0' + carry;
            }
            // 同上
            else if(j < 0){
                nowSum = s.charAt(i) - '0' + carry;
            }
            // 都没结束的情况(注意,这三种情况都要考虑 carry 位)
            else{
                nowSum = s.charAt(i) + t.charAt(j) - '0' - '0' + carry;
            }
            // 进位处理
            carry = nowSum / 10;
            nowSum %= 10;
            ans[maxL - 1] = (char)(nowSum + '0');
        }
        String ansS = new String(ans);
        // 最后一次进位处理
        if(carry == 1){
            ansS = '1' + ansS;
        }
        return ansS;
        // write code here
    }
}

更新版

  • 刷到评论区大佬的做法,很nice
  • while 循环写得很巧妙。
class Solution {
    public String addStrings(String num1, String num2) {
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        int i = num1.length() - 1, j = num2.length() - 1;
        while(i >= 0 || j >= 0 || carry != 0) {
            if(i >= 0) {
                carry += num1.charAt(i--) - '0';
            }
            if(j >= 0) {
                carry += num2.charAt(j--) - '0';
            }
            sb.append(carry % 10);
            carry /= 10;
        }
        return sb.reverse().toString();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值