LeetCode - 415 字符串相加(Java JS Python C C++)

news2024/11/19 3:37:41

题目来源

415. 字符串相加 - 力扣(LeetCode)

题目描述

给定两个字符串形式的非负整数 num1 和 num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例

示例 1:

输入:num1 = "11", num2 = "123"
输出:"134"


示例 2:

输入:num1 = "456", num2 = "77"
输出:"533"


示例 3:

输入:num1 = "0", num2 = "0"
输出:"0"

提示

  • 1 <= num1.length, num2.length <= 10^4
  • num1 和 num2 都只包含数字 0-9
  • num1 和 num2 都不包含任何前导零

题目解析

本题需要我们模拟整数加法运算。

两个整数的加法运算,都是从个位对齐,逐位相加。

本题给定的是数字字符串,因此整数的个位,其实就数字字符串的尾巴(索引位s.length-1)

因此,我们可以定义两个指针 i,j ,分别指向num1和num2的尾巴索引位置,即初始时:

  • i = num1.length - 1
  • j = num2.length - 1

然后我们将 num1[i] 和 num2[j] 相加,进行个位部分相加

此时个位相加的结果没有超过10,即无需进位,因此我们 i--, j-- 向前移动一位,进行十位部分相加

此时十位部分,num1[i] + num2[j] 的结果result为 11,超过了10,即需进位1(result % 10),当前十位结果为1(result / 10)

之后,i--,j--继续向前移动,此时发现,j指针越界了

但是百位任然需要进行计算,因为num1的百位还有值,且进位carry也有值,因此此轮我们需要将

num1的百位和carry进行相加

相加后,进位值被消耗,carry应该重新变为0,然后百位加法完成。

之后继续 i--,j--,向前移动到下一位,此时 i,j都越界了,且carry==0,则可以认为计算完毕


因此,模拟整数加法运算其实很简单,主要逻辑为:

  • 对齐两个整数字符串的十进制位(个位对个位,十位对十位...),即字符串尾部对齐
  • 对应位相加,如果结果result超过10,则需要进位 result % 10,进位后,本位结果为 result / 10
  • 实际上对应位相加,不仅是num1[i]和num2[j]的相加,还要加上上一轮的进位值carry
  • 只要num1或num2没有遍历完(还有剩余位未参加计算),或者上一轮计算的进位carry不为0,则我们要继续相加

Java算法源码

class Solution {
    public String addStrings(String a, String b) {
        // 个位(字符串尾部)对齐, 即a[i]是a的个位值,b[j]是b的个位值
        int i = a.length() - 1;
        int j = b.length() - 1;
        // 记录进位值
        int carry = 0;

        // 记录结果串
        StringBuilder sb = new StringBuilder();

        // 只要a未遍历完,或b未遍历完,或上一轮进位carry不为0,则需要继续加法
        while (i >= 0 || j >= 0 || carry != 0) {
            // a[i]位的数x
            int x = i >= 0 ? a.charAt(i) - '0' : 0;
            // b[j]位的数y
            int y = j >= 0 ? b.charAt(j) - '0' : 0;

            // 当前位相加结果
            int result = x + y + carry;

            // 当前位计算结果不能超过10(十进制的位值不能超过10)
            sb.append(result % 10);
            // 超过10需要进位
            carry = result / 10;

            // 向前移动到下一位
            i--;
            j--;
        }

        // 由于sb是依次录入个位、十位、百位...的结果值,因此sb实际是倒的数字,我们需要反转一下
        return sb.reverse().toString();
    }
}

 

JS算法源码

var addStrings = function (a, b) {
  // 个位(字符串尾部)对齐, 即a[i]是a的个位值,b[j]是b的个位值
  let i = a.length - 1;
  let j = b.length - 1;
  // 记录进位值
  let carry = 0;

  // 记录结果串
  const ans = [];

  // 只要a未遍历完,或b未遍历完,或上一轮进位carry不为0,则需要继续加法
  while (i >= 0 || j >= 0 || carry != 0) {
    // a[i]位的数x
    const x = i >= 0 ? parseInt(a[i]) : 0;
    // b[j]位的数y
    const y = j >= 0 ? parseInt(b[j]) : 0;

    // 当前位相加结果
    const result = x + y + carry;

    // 当前位计算结果不能超过10(十进制的位值不能超过10)
    ans.push(result % 10);
    // 超过10需要进位
    carry = parseInt(result / 10);

    // 向前移动到下一位
    i--;
    j--;
  }

  // 由于ans是依次录入个位、十位、百位...的结果值,因此ans实际是倒的数字,我们需要反转一下
  return ans.reverse().join("");
};

 

Python算法源码

class Solution(object):
    def addStrings(self, a, b):
        # 个位(字符串尾部)对齐, 即a[i]是a的个位值,b[j]是b的个位值
        i = len(a) - 1
        j = len(b) - 1
        # 记录进位值
        carry = 0

        # 记录结果串
        ans = []

        # 只要a未遍历完,或b未遍历完,或上一轮进位carry不为0,则需要继续加法
        while i >= 0 or j >= 0 or carry != 0:
            # a[i]位的数x
            x = int(a[i]) if i >= 0 else 0
            # b[j]位的数y
            y = int(b[j]) if j >= 0 else 0

            # 当前位相加结果
            result = x + y + carry

            # 当前位计算结果不能超过10(十进制的位值不能超过10)
            ans.append(result % 10)
            # 超过10需要进位
            carry = result // 10

            # 向前移动到下一位
            i -= 1
            j -= 1

        # 由于ans是依次录入个位、十位、百位...的结果值,因此ans实际是倒的数字,我们需要反转一下
        ans.reverse()
        return "".join(map(str, ans))

C算法源码

char *addStrings(char *a, char *b) {
    // 个位(字符串尾部)对齐, 即a[i]是a的个位值,b[j]是b的个位值
    int i = strlen(a) - 1;
    int j = strlen(b) - 1;
    // 记录进位值
    int carry = 0;

    // 记录结果串
    char *sb = (char *) calloc((int) fmax(i, j) + 3, sizeof(char));
    int sb_size = 0;

    // 只要a未遍历完,或b未遍历完,或上一轮进位carry不为0,则需要继续加法
    while (i >= 0 || j >= 0 || carry != 0) {
        // a[i]位的数x
        int x = i >= 0 ? a[i] - '0' : 0;
        // b[j]位的数y
        int y = j >= 0 ? b[j] - '0' : 0;

        // 当前位相加结果
        int result = x + y + carry;

        // 当前位计算结果不能超过10(十进制的位值不能超过10)
        sb[sb_size++] = (char) ((result % 10) + '0');
        // 超过10需要进位
        carry = result / 10;

        // 向前移动到下一位
        i--;
        j--;
    }

    // 由于sb是依次录入个位、十位、百位...的结果值,因此sb实际是倒的数字,我们需要反转一下
    int l = 0;
    int r = sb_size - 1;

    while (l < r) {
        char tmp = sb[l];
        sb[l] = sb[r];
        sb[r] = tmp;
        l++;
        r--;
    }

    return sb;
}

C++算法源码

class Solution {
public:
    string addStrings(string a, string b) {
        // 个位(字符串尾部)对齐, 即a[i]是a的个位值,b[j]是b的个位值
        int i = a.length() - 1;
        int j = b.length() - 1;
        // 记录进位值
        int carry = 0;

        // 记录结果串
        string sb;

        // 只要a未遍历完,或b未遍历完,或上一轮进位carry不为0,则需要继续加法
        while (i >= 0 || j >= 0 || carry != 0) {
            // a[i]位的数x
            int x = i >= 0 ? a[i] - '0' : 0;
            // b[j]位的数y
            int y = j >= 0 ? b[j] - '0' : 0;

            // 当前位相加结果
            int result = x + y + carry;

            // 当前位计算结果不能超过10(十进制的位值不能超过10)
            sb += to_string(result % 10);
            // 超过10需要进位
            carry = result / 10;

            // 向前移动到下一位
            i--;
            j--;
        }

        // 由于sb是依次录入个位、十位、百位...的结果值,因此sb实际是倒的数字,我们需要反转一下
        reverse(sb.begin(), sb.end());

        return sb;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1838603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

刷代码随想录有感(108):动态规划——目标和

题干&#xff1a; 代码&#xff1a; class Solution { public:int findTargetSumWays(vector<int>& nums, int target) {int sum 0;for(int i : nums) sum i;if(abs(target) > sum)return 0;if((sum target) % 2 ! 0)return 0;int bagweight (sum target) /…

高考志愿填报选专业,你是听父母还是自己选?

在就业环境如此激烈的今天&#xff0c;就读好的专业意味着在竞争中占据一定的优势&#xff0c;而在拿到高考分数后&#xff0c;如何进行专业选择让不少人伤透了脑筋。很多学生愿意遵从自身意愿&#xff0c;就读自己喜欢的专业&#xff0c;但是当他提出想要就读哪个专业的想法后…

Python爬虫小白入门(二)BeautifulSoup库

一、前言 上一篇演示了如何使用requests模块向网站发送http请求&#xff0c;获取到网页的HTML数据。这篇来演示如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据。 二、运行环境 我的运行环境如下&#xff1a; 系统版本 Windows10。 Python版本 Python3.5&#xf…

为什么人们对即将推出的 Go 1.23 迭代器感到愤怒

原文&#xff1a;gingerBill - 2024.06.17 TL;DR 它让 Go 变得太“函数式”&#xff0c;而不再是不折不扣的命令式语言。 最近&#xff0c;我在 Twitter 上看到一篇帖子&#xff0c;展示了 Go 1.23&#xff08;2024 年 8 月&#xff09;即将推出的 Go 迭代器设计。据我所知&a…

「动态规划」如何求乘积为正数的最长子数组长度?

1567. 乘积为正数的最长子数组长度https://leetcode.cn/problems/maximum-length-of-subarray-with-positive-product/description/ 给你一个整数数组nums&#xff0c;请你求出乘积为正数的最长子数组的长度。一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。…

2024年GIS专业就业现状和解决办法

GIS专业发展历史 我国从20世纪80年代初引进和研究地理信息系统(GIS) 以来&#xff0c;经过30年的飞速发展&#xff0c;地理信息已成为信息时代重要的组成部分之一&#xff0c;被广泛应用于多个领域的建模和决策支持。 在国家数字化政策的加持下&#xff0c;GIS更成为新基建下…

敏感信息加密操作,让开发的系统更加的安全可靠!!

敏感信息加密操作&#xff0c;让开发的系统更加的安全可靠&#xff01;&#xff01;Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个开源的Java库&#xff0c;用于简化加密操作。https://mp.weixin.qq.com/s/sPBV8Ej46YJsElImodRjAQ

反射的原理和操作

反射是框架设计的灵魂 &#xff08;使用的前提条件&#xff1a;必须先得到代表的字节码的Class&#xff0c;Class类用于表示.class文件&#xff08;字节码&#xff09;&#xff09; 在Java中&#xff0c;反射是指在运行时动态地获取、检查和操作类、对象、方法和属性的能力。J…

第2章 Rust初体验3/8:使用Result进行错误处理:编译时错误检查增强代码安全性:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.3.9 类型的关联函数:简化对象创建和初始化 席双嘉:“那个String::new(),毫无疑问,它确实像C++中的静态成员函数。” 贾克强:“哈哈!是的,两个冒号确实让人联想到一些东西,对吧?” “这其实是Rust中的关联函数(associated function,详…

第四集《唯识与净土》

请大家打开讲义第十面。 我们讲到念佛的功德有两个&#xff1a;第一个是“现世的安乐”&#xff0c;第二个是“来世究竟的解脱”。 这个净土法门的特色&#xff0c;是一种本尊相应法。 也就是说&#xff0c;我们在整个修行破恶生善的过程当中&#xff0c;主要是要仰仗本尊的…

设计师必看|精选免费icon生成网站推荐

在平面设计过程中&#xff0c;如何收集icon素材&#xff1f;(opens in a new tab or window)&#xff1f; 在这里我们为您准备了三个免费、易用的icon生成网站&#xff0c;需要icon材料的同学&#xff0c;记得点赞收藏。 01∣即时设计 作为国内领先的在线设计平台&#xff0…

创建第一个Springboot项目(环境准备、环境存在的问题、启动时存在的问题、启动的方式)

一、环境准备 专业版创建springboot&#xff0c;直接有一个选项可以选择 社区版&#xff0c;需要下载一个spring的插件 不要直接点 install 因为这个插件是付费的&#xff0c;直接点安装只有30天使用期限 在里面找免费版本的下载 然后安装 安装完成后&#xff0c;这个插件名会变…

作为程序员,科班计算机比起非科班有很大优势吗?

在当今这个快速变化的时代&#xff0c;个人的能力与优势成为了职场竞争中的关键因素。在众多的职业选择中&#xff0c;程序员因其独特的技能和市场需求而备受青睐。 然而&#xff0c;并非所有人在18岁就决定要进入计算机行业&#xff0c;许多人都是在大学毕业之后由于种种原因…

一步步教你用Python Selenium抓取动态网页任意行数据

引言 在现代网络中&#xff0c;动态网页越来越普遍&#xff0c;这使得数据抓取变得更具挑战性。传统的静态网页抓取方法在处理动态内容时往往力不从心。本文将详细介绍如何使用Python Selenium抓取动态网页中的任意行数据&#xff0c;并结合代理IP技术以提高抓取的成功率和效率…

PostgreSQL源码分析——缓冲区管理器

这里我们分析一下PG数据库缓冲区的代码。缓冲区是十分重要的&#xff0c;对数据库的性能和稳定性有着直接的影响。缓冲区是数据库SQL计算层与外部存储&#xff08;磁盘&#xff09;交互的关键。数据页的落盘与读取&#xff0c;都要经过缓冲区。 README src/backend/storage/…

本地部署AI模型-phi3

What&#xff1a; Phi-3-Mini被认为是Microsoft计划发布的三款小型机型中的首款。据报道&#xff0c;在语言、推理、编码和数学等领域&#xff0c;它在各种基准测试中的表现优于相同大小和下一个尺寸的模型。 从本质上讲&#xff0c;语言模型是 ChatGPT、Claude、Gemini 等 AI…

WPF/C#:显示分组数据的两种方式

前言 本文介绍自己在遇到WPF对数据进行分组显示的需求时&#xff0c;可以选择的两种方案。一种方案基于ICollectionView&#xff0c;另一种方案基于IGrouping。 基于ICollectionView实现 相关cs代码&#xff1a; [ObservableProperty] private ObservableCollection<Peo…

变声方法大公开,变女声很自然的3款变声器推荐,值得收藏

将男声变成女声并且要很自然的变声器有吗&#xff1f;很多喜欢玩游戏的小伙伴们在进行游戏连麦时&#xff0c;可能为了增加趣味&#xff0c;想要试试变成女声来交流&#xff0c;或者喜欢视频剪辑创作的小伙伴们在进行视频配音时&#xff0c;不想用自己的声音出镜&#xff0c;需…

WGCLOUD的web ssh提示websocket服务连接已断开

这个问题一般是server主机没有开放端口9998&#xff0c;因为9998是web ssh的端口&#xff0c;需要开放 我们只要在防火墙&#xff0c;或者安全软件&#xff0c;把这个端口开放了就可以了

STM32HAL库--NVIC和EXTI

1. 外部中断实验 1.1 NVIC和EXTI简介 1.1.1 NVIC简介 NVIC 即嵌套向量中断控制器&#xff0c;全称 Nested vectored interrupt controller。是ARM Cortex-M处理器中用于管理中断的重要组件。负责处理中断请求&#xff0c;分配优先级&#xff0c;并协调中断的触发和响应。 它是…