快手/字节 CodeTop LeetCode 415.字符串相加

思路:模拟人工加法。

一、算法流程:设定i,j两指针分别指向num1、num2尾部,模拟人工加法。

1.计算进位:计算carry = tmp / 10,代表当前位相加是否产生进位;

2.添加当前位:计算tmp = n1 + n2 + carry,并将当前位tmp % 10,添加至res头部;

3.索引溢出处理:当指针i或j走过数字首部后,给n1、n2赋值为0,相当于给num1、num2中长度较短的数字前面填0,以便后续计算;

4.当遍历完num1、num2后,跳出循环,并根据carry值决定是否在头部添加进位1,最终返回res即可。

二、复杂度分析:

1.时间复杂度:O(max(M,N)),其中M和N为两个数字的长度,按位遍历一遍数字(以较长的数字为准)。

2.空间复杂度:O(1),指针与变量需要使用常数大小的空间。

注意:

(1)字符串相加是对应位相加,因此i和j是从字符串最后一位做完运算后,i--,j--。

(2)字符串相乘是每位都要和对方的所有位相乘,因此是

for(int i = num1.length() - 1;i >= 0;i--){

int val1 =

for(int j = num2.length() - 1;j >= 0;j--){

int val2 =

int sum =

处理当前位和进位

}

}

附代码:

java 复制代码
class Solution {
    public String addStrings(String num1, String num2) {
        StringBuilder res = new StringBuilder();
        int i = num1.length() - 1,j = num2.length() - 1,carry = 0;
        while(i >= 0 || j >= 0){
            int val1 = i >= 0 ? num1.charAt(i) - '0' : 0;
            int val2 = j >= 0 ? num2.charAt(j) - '0' : 0;
            int tmp = val1 + val2 + carry;
            carry = tmp / 10;
            res.append(tmp % 10);
            i--;j--;
        }
        // 处理最高位相加后可能产生的进位
        // 在加法运算中,当两个数字的最高位相加(加上之前的进位)后,如果结果大于等于10,就会产生一个进位
        // 这个进位要在循环结束后单独处理
        if(carry == 1){
            res.append(1);
        }
        return res.reverse().toString();
    }
}

ACM模式:

java 复制代码
import java.util.Scanner;

class Solution {
    public String addStrings(String num1, String num2) {
        StringBuilder res = new StringBuilder();
        int i = num1.length() - 1, j = num2.length() - 1, carry = 0;
        while (i >= 0 || j >= 0) {
            int val1 = i >= 0 ? num1.charAt(i) - '0' : 0;
            int val2 = j >= 0 ? num2.charAt(j) - '0' : 0;
            int tmp = val1 + val2 + carry;
            carry = tmp / 10;
            res.append(tmp % 10);
            i--;
            j--;
        }
        if (carry == 1) {
            res.append(1);
        }
        return res.reverse().toString();
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取两个数字字符串
        String num1 = scanner.next();
        String num2 = scanner.next();

        // 计算字符串相加结果
        Solution solution = new Solution();
        String result = solution.addStrings(num1, num2);
        System.out.println(result);

        scanner.close();
    }
}
相关推荐
DragonnAi2 小时前
猫咪如厕检测与分类识别系统系列【十四】 项目结构重新整理-即将开源完整算法
算法·开源
机器视觉_Explorer2 小时前
【halcon】编程技巧:鼠标擦除
图像处理·人工智能·深度学习·算法·视觉检测
灵智实验室3 小时前
PX4状态估计技术EKF2详解(二):EKF2 误差状态动力学与协方差传播
算法·无人机·px 4
米粒13 小时前
力扣算法刷题 Day 64 Floyd算法 & A* 算法 & 总结篇
算法·leetcode·职场和发展
XX風3 小时前
OpenGL中Face culling 面剔除的具体实现
算法·图形渲染
IT猿手3 小时前
光伏模型参数估计:基于山羊优化算法(GOA )的光伏模型参数辨识问题求解研究,免费提供完整MATLAB代码链接
开发语言·算法·matlab·群智能优化算法·智能优化算法·光伏模型参数估计·光伏模型参数辨识
麻雀飞吧4 小时前
期货量化策略讲解:天勤量化下的跨期价差均值回归策略实战
python·算法·均值算法·回归
sali-tec4 小时前
C# 基于OpenCv的视觉工作流-章62-线线距离
图像处理·人工智能·opencv·算法·计算机视觉
WolfGang0073215 小时前
代码随想录算法训练营 Day53 | 图论 part11
算法·图论