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

目录

题目描述

思路分析

一般法

秀儿法

代码

一般法

秀儿法


题目描述

本题来源于力扣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 的数,记作 digitsi

进位,把 digitsi 加一,把下标在 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
相关推荐
3Q工具箱 - BraggTroy9 小时前
Python + PyInstaller 实战:从零打造 10 个 Windows 桌面小工具(附全部踩坑记录与核心代码)
开发语言·windows·python
计算机编程-吉哥9 小时前
基于机器学习的城市交通拥堵分析与预测平台【计算机毕业设计选题·机器学习·随机森林算法】
hadoop·算法·随机森林·机器学习·课程设计·计算机毕业设计选题·大数据毕业设计选题推荐
zyeyeye10 小时前
C++入门:从HelloWorld到命名空间揭秘
c语言·开发语言·c++·算法
牧羊人.33310 小时前
动手学深度学习 04 | Dataset 和 DataLoader、数据增强
人工智能·pytorch·深度学习·算法
泡海椒10 小时前
脚本包导入实战:JQuick-Java自定义包引入与别名配置教程
java·开发语言·python
fbbqt10 小时前
Python模块与包
开发语言·python
数智化码农10 小时前
半导体制造人力资源数字化选型:适配双用工体系,兼顾合规与人效
大数据·运维·python·制造
elseif12310 小时前
【双指针/二分】P1102 A-B 数对
c++·算法·二分·双指针
电梯界知识分子10 小时前
江西抚州临川九尊府五层别墅:受限楼梯间里,全黑铝合金观光井道配曳引龙门架的落地记录
大数据·前端·网络·算法·家用电梯
statistican_ABin10 小时前
中国婚姻与生育观念变迁分析报告
python