数学(五) -- LC[415]&[455] 字符串相加与两数相加

2023-11-20

1 字符串相加

1.1 题目描述

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

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

示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”

示例 2:
输入:num1 = “456”, num2 = “77”
输出:“533”

示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”

1.2 思路分析

  • 算法流程: 设定 i , j i,j ij 两指针分别指向 num1,num2 尾部,模拟人工加法;
    • 计算进位: 计算 carry = tmp // 10,代表当前位相加是否产生进位;
    • 添加当前位: 计算 tmp = n1 + n2 + carry,并将当前位 tmp % 10 添加至 res 头部;
    • 索引溢出处理: 当指针 i或j 走过数字首部后,给 n1,n2 赋值为 0,相当于给 num1,num2 中长度较短的数字前面填 0,以便后续计算。
    • 当遍历完 num1,num2 后跳出循环,并根据 carry 值决定是否在头部添加进位 1,最终返回 res 即可。



class Solution:
    def addStrings(self, num1: str, num2: str) -> str:
        i, j, carry = len(num1)-1, len(num2)-1, 0
        res = ''
        while i >= 0 or j >= 0:
            n1 = int(num1[i]) if i >= 0 else 0
            n2 = int(num2[j]) if j >= 0 else 0
            n = n1 + n2 + carry
            carry = n // 10
            res = str(n%10) + res
            i, j = i-1, j-1
        return '1'+res if carry else res

复杂度分析:
- 时间复杂度 O ( m a x ( M , N ) ) O(max(M,N)) O(max(M,N)):其中 M , N M,N MN 2 2 2 数字长度,按位遍历一遍数字(以较长的数字为准);
- 空间复杂度 O ( 1 ) O(1) O(1):指针与变量使用常数大小空间。

2 两数相加

2.1 题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.



示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

2.2 思路分析

由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加。

我们同时遍历两个链表,逐位计算它们的和,并与当前位置的进位值相加。具体而言,如果当前两个链表处相应位置的数字为 n 1 , n 2 n1,n2 n1,n2,进位值为 carry \textit{carry} carry,则它们的和为 n 1 + n 2 + carry n1+n2+\textit{carry} n1+n2+carry;其中,答案链表处相应位置的数字为 ( n 1 + n 2 + carry )   m o d   10 (n1+n2+\textit{carry}) \bmod 10 (n1+n2+carry)mod10,而新的进位值为 ⌊ n 1 + n 2 + carry 10 ⌋ \lfloor\frac{n1+n2+\textit{carry}}{10}\rfloor 10n1+n2+carry

如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个 0 。

此外,如果链表遍历结束后,有 carry > 0 \textit{carry} > 0 carry>0,还需要在答案链表的后面附加一个节点,节点的值为 carry \textit{carry} carry

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        head = current = ListNode()
        res, newval = 0, 0          # 进位值和余数
        while res or l1 or l2:
            if l1: l1, newval = l1.next, l1.val + newval
            if l2: l2, newval = l2.next, l2.val + newval
            res, newval = divmod(newval,10)
            current.next = current = ListNode(newval)
            newval = res
        return head.next

复杂度分析

  • 时间复杂度: O ( max ⁡ ( m , n ) ) O(\max(m,n)) O(max(m,n)),其中 m m m n n n 分别为两个链表的长度。我们要遍历两个链表的全部位置,而处理每个位置只需要 O ( 1 ) O(1) O(1) 的时间。
  • 空间复杂度: O ( 1 ) O(1) O(1)。注意返回值不计入空间复杂度。

3 两数相加 II

3.1 题目描述

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例1:
输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]



示例2:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]

示例3:
输入:l1 = [0], l2 = [0]
输出:[0]

3.2 思路分析

  • 反转链表 l 1 l_1 l1
  • 反转链表 l 2 l_2 l2
  • 调用 2. 两数相加 的代码,得到链表 l 3 l_3 l3
  • 反转链表 l 3 l_3 l3 返回 l 3 l_3 l3 作为答案。
class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        def list_reverse(l):
            prev, curr = None, l
            while curr:
                temp = curr.next
                curr.next = prev
                prev = curr
                curr = temp
            return prev


        def two_numbers(l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
            head = current = ListNode()
            res, newval = 0, 0          # 进位值和余数
            while res or l1 or l2:
                if l1: l1, newval = l1.next, l1.val + newval
                if l2: l2, newval = l2.next, l2.val + newval
                res, newval = divmod(newval,10)
                # current.next = current = ListNode(newval)
                current.next = current = ListNode(newval)
                newval = res
            return head.next

        dummy = ListNode(-1)
        l1, l2 = list_reverse(l1), list_reverse(l2)
        return list_reverse(two_numbers(l1, l2))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数学(五) -- LC[415]&[455] 字符串相加与两数相加 的相关文章

随机推荐

  • Ubuntu20.04通过rsync和inotify实现定时备份与实时备份

    通过rsync和inotify实现定时备份与实时备份 为了避免主服务单点故障 可以将数据备份到远程备份机器 可以使用rsync工具同步Jenkins home到远程 可以利用rsync工具的 exclude from FILE 功能 定制一
  • KVM热迁移

    KVM热迁移 介绍 KVM热迁移的前提是拥有共享存储 以下通过NFS实现KVM热迁移 迁移过程 将一处于运行状态的KVM虚拟机从节点kvm 01迁移到kvm 02后继续运行 准备 主机准备 hostname IP地址 系统 配置 kvm 0
  • Docker 国内镜像地址

    http f1361db2 m daocloud io http hub mirror c 163 com https docker mirrors ustc edu cn
  • c++中的类模板

    C 的类模板为生成通用的类声明提供了一种更好的方法 模板提供参数化类型 即能够将类型名作为参数传递给接收方来建立类或者函数 一 定义类模板 include
  • IndexError: index 5 is out of bounds for axis 1 with size 5

    keras中报错 IndexError index 5 is out of bounds for axis 1 with size 5 原因 大概率是你的数据集label没有设置好 keras中数据集标签需要从0开始 并且连续 类似于下图这
  • Unity WebGL错误集锦

    ips 0 Unity的PlayerSettings的otherSettings或者Publish Settings里面的Enable Exceptions里面选择Full StackTrace 可以在打出的包中的浏览器的webgl打印出错
  • 【计算机基础

    定点数的表示 定点数 小数点的位置固定 例 996 007 常规计数 浮点数 小数点的位置不固定 例 9 96007 10 2 科学计数法 二进制的定点数 浮点数也类似 无符号数 整个机器字长的全部二进制位均为数值位 没有符号位 相当于数的
  • 关于Linux和Shell的相关书籍

    入门类 一直认为 在一个系统上学习开发之前 首先需要熟悉这个系统的使用 鉴于天朝的国情 绝大部分人第一个接触的操作系统就是Windows 因此对于这绝大部分人来说 如果要学习Linux开发 学会使用这个系统都是必不可少的一个环节 现在的Li
  • UVa 1347 Tour

    题目 Tour 题意 来自luogu John Doe想用最小的路程游览完所有目的地 每个目的地都用坐标xi yi表示 任何两目的地的xi都不相同 两目的地之间的路程是两点之间的直线距离 John是这样走的 他从最左边的点开始 然后只能向右
  • word页码如何设置为章节加页码,例如第一章第一页1-1、第二章第一页2-1

    由于用到word页码分章节 页码的形式 从网上查了一下 质量真的很差 没有一篇文章讲清楚的 有的所答非所问 一怒之下 利用几个小时的时间解决问题并写下这篇文章 以供大家学习参考 1 word插入页码 选择包含章节号 1 1 双击页脚 点击插
  • 55黑马QT笔记之关闭子线程

    55黑马QT笔记之关闭子线程 1 这里为什么要单独写多一篇文章来说线程的关闭呢 主要是想让大家提升印象 养成资源回收的好习惯 任何时候都要想起开辟过的内存回收 这里的关闭子线程上一篇也写到了 就是利用关闭窗口时调用槽函数回收掉 2 具体步骤
  • 2023最新ChatGPT网站源码+支持GPT4+Ai绘画+用户会员套餐+邀请分佣功能+支持后台一键更新+永久更新!

    2023最新ChatGPT网站源码 支持GPT4 Ai绘画 用户会员套餐 邀请分佣功能 支持后台一键更新 永久更新 可同时 单独 开启或者关闭GPT3 5和GPT4 0两种ChatGPT提问模型 用户可切换 次数套餐也是分开的 支持手机电脑
  • News Feed 系统设计

    新鲜事系统 News Feed 什么是新鲜事 News Feed 你登陆 Facebook Twitter 朋友圈 之后看到的信息流 你的所有朋友发的信息的集合 有哪些典型的新鲜事系统 Facebook Twitter 朋友圈 RSS Re
  • Windows与Linux系统实现文件互传(通俗易懂)

    SCP指令可以实Windows系统与Linux系统之间的文件互传 引言 Windows系统文件传输到Linux系统上 先操作 Windows系统文件传输到Linux系统上 再细聊 Linux系统文件传输到Windows系统上 先操作 Lin
  • 趁着周日我卷了 uni-app《uview 狠 优秀的UI框架》

    前期回顾 手写一个服务器代码将 vue电商后台管理系统 部署上去 上线 打包 活在风浪里的博客 CSDN博客亲测可用 一定会收获颇多 1 上线vue电商后台管理项目2 手写搭建服务器并挂载 node 3 打包优化 完成上线https blo
  • Shell数组:shell数组的定义、数组长度

    Shell在编程方面比Windows批处理强大很多 无论是在循环 运算 bash支持一维数组 不支持多维数组 并且没有限定数组的大小 类似与C语言 数组元素的下标由0开始编号 获取数组中的元素要利用下标 下标可以是整数或算术表达式 其值应大
  • QGIS插件式开发(一)---PyQt5+python3.6+Pychram2017.3开发环境配置

    1 PyQt简介 PyQt是用来创建GUI应用程序的工具包 它把python和Qt成功地绑定在一起 Qt库是目前最强大的库之一 PyQt是由Phil Thompson开发 PyQt实现了一个Python模块集 它有超过300个类 将近600
  • 通过哲学家进餐问题学习线程间协作(代码实现以leetcode1226为例)

    哲学家进餐问题 代码实现以leetcode1226为例 问题场景 解决思路 解决死锁问题 代码实现 c go 代码实现以leetcode1226为例 提到多线程和锁解决问题 就想到了os中哲学家进餐问题 问题场景 回想该问题产生场景 五个哲
  • 流形学习(Manifold Learning)

    https www cnblogs com jiangxinyang p 9314256 html 1 什么是流形 流形学习的观点 认为我们所能观察到的数据实际上是由一个低维流行映射到高维空间的 由于数据内部特征的限制 一些高维中的数据会产
  • 数学(五) -- LC[415]&[455] 字符串相加与两数相加

    1 字符串相加 1 1 题目描述 给定两个字符串形式的非负整数 num1 和num2 计算它们的和并同样以字符串形式返回 你不能使用任何內建的用于处理大整数的库 比如 BigInteger 也不能直接将输入的字符串转换为整数形式 示例 1