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

目录

题目描述

思路分析

一般法

秀儿法

代码

一般法

秀儿法


题目描述

本题来源于力扣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
相关推荐
历程里程碑6 分钟前
Linux22 文件系统
linux·运维·c语言·开发语言·数据结构·c++·算法
寻星探路5 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
你撅嘴真丑7 小时前
第九章-数字三角形
算法
uesowys7 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder8 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮8 小时前
AI 视觉连载1:像素
算法
智驱力人工智能8 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
猫头虎8 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
孞㐑¥9 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
八零后琐话9 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python