【算法】大整数数组连续进位

目录

题目描述

思路分析

一般法

秀儿法

代码

一般法

秀儿法


题目描述

本题来源于力扣66.加一

给定一个表示 大整数 的整数数组 digits,其中 digits[i] 是整数的第 i 位数字。这些数字按从左到右,从最高位到最低位排列。这个大整数不包含任何前导 0

将大整数加 1,并返回结果的数字数组。

示例1

输入: digits = [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

加 1 后得到 123 + 1 = 124。

因此,结果应该是 [1,2,4]。

示例2

输入: digits = [9]
输出: [1,0]
解释: 输入数组表示数字 9。

加 1 得到了 9 + 1 = 10。

因此,结果应该是 [1,0]。

思路分析

本题目可以分两种情况来分析

(1)加1后没有产生进位

(2)加1后产生进位

对于(1)就非常简单了,把数组最后一位+1返回就行,下面主要来说(2)

(2)的主要问题是连续进位,即最后一位进位之后,前面如果是9则需要继续进位,下面介绍两种解决方法

一般法

笔者自己做的时候用的是这种方法,主要思路为:

设置一个标识变量carry_flag来表示当前是否有未处理的进位,然后倒着遍历数组

(1)如果当前遍历的元素是9并且carry_flag=1,说明要进位,当前元素改成0,carry_flag不变

(2)如果当前遍历的元素不是9并且carry_flag=1,说明无需进位,把当前元素加1后返回整个数组即可

(3)如果一直没有进到(2),说明数组是全由9构成(如[9,9,9]),这种情况下返回时在最前面需要添加一个1,即999变成1000

代码见第三节

秀儿法

本来笔者觉得自己的思路还算简洁,但看了题解竟然还有更变态的,这里引用力扣用户灵茶山艾府的题解,出处:66. 加一 - 力扣(LeetCode)

算法:

从右往左找第一个不等于 9 的数,记作 digits[i]。

进位,把 digits[i] 加一,把下标在 [i+1,n−1] 中的数全变成 0。

特别地,如果所有数都等于 9,那么答案为 [1,0,0,...,0],其中有 n 个 0。

代码

一般法

python 复制代码
class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        flag = 1 if digits[len(digits) - 1] == 9 else 0
        if flag == 0:
            digits[len(digits) - 1] += 1
            return digits
        else:
            digits[len(digits) - 1] = 0
            carry_flag = 1
            for i in range(len(digits) - 2, -1, -1):
                if digits[i] == 9 and carry_flag == 1:
                    digits[i] = 0
                elif digits[i] != 9 and carry_flag == 1:
                    digits[i] += 1
                    return digits
            return [1]+digits

秀儿法

python 复制代码
class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        for i in range(len(digits) - 1, -1, -1):
            if digits[i] < 9:
                digits[i] += 1  # 进位
                return digits
            digits[i] = 0  # 进位数字的右边数字都变成 0
        # digits 全是 9,加一后变成 100...00
        return [1] + digits
相关推荐
董董灿是个攻城狮9 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
IVEN_16 小时前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
AI软著研究员16 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish17 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Ray Liang17 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
颜酱17 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
AI攻城狮18 小时前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling18 小时前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python
AI攻城狮21 小时前
用 Playwright 实现博客一键发布到稀土掘金
python·自动化运维