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

目录

题目描述

思路分析

一般法

秀儿法

代码

一般法

秀儿法


题目描述

本题来源于力扣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
相关推荐
金銀銅鐵1 天前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li1 天前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
先吃饱再说1 天前
判断回文字符串,从一行代码到双指针优化
算法
小九九的爸爸1 天前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
阿耶同学1 天前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六2 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术2 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试