游乐游手机版
首页/AI教程/文章详情

Leetcode加一解法 Java与Python3实现

时间:2026-05-30 06:27
给定一个非空整数数组表示非负整数,每位加一。需处理进位边界情况:从末位遍历,若加一后为10则置0并进位;若首位进位为0,则新建长度加一的数组,首位设1。此解法模拟竖式加法,避免大整数转换溢出问题。

LeetCode 加一:数组加一算法详解与边界处理

这道题表面简单,却是许多面试中热衷考察的“边界细节”题目。给你一个非空整数数组,每个元素只存储一位数字,整个数组表示一个非负整数——例如 [1,2,3] 对应数字 123。现在需要在这个整数的基础上加一,并返回加一后的数组结果。

Leetcode加一 (ja va、python3)

最高位数字存放在数组的首位,并且我们可以假设除了整数 0 本身之外,这个整数不会以零开头——也就是说,输入不会是 [0,1,2] 这类格式。

英文题目描述如下:Given a non-empty array of digits representing a non-negative integer, plus one to the integer. The digits are stored such that the most significant digit is at the head of the list, and each element in the array contain a single digit. You may assume the integer does not contain any leading zero, except the number 0 itself.

下面通过两个示例来直观理解:

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

示例 2:
输入: [4,3,2,1] 输出: [4,3,2,2] 解释: 输入数组表示数字 4321。

看起来直接转成整数加一就能解决?但别忘了,数组元素可能多达几千位,普通整型根本无法存储。因此必须采用“模拟竖式加法”的思路来逐位处理进位。

Java 解法:

class Solution {
    public int[] plusOne(int[] digits) {
        for( int i=digits.length;i>=0;i--){
            if(digits[i] 1==10){
                digits[i]=0;
            }else {
                digits[i] =1;
                break;
            }
        }
        if(digits[0]==0){
            int[] digits2=new int[digits.length 1];
            digits2[0]=1;
            return digits2;
        }else {
            return digits;
        }
    }
}

解题思路详解:

核心逻辑非常直观:从数组的最右端(即个位)开始向左遍历。如果当前位加一后等于10,说明需要进位,将该位设为0,然后继续处理前一位;若加一后不等于10,则加一操作完成,直接跳出循环。有一个容易被忽略的细节:当所有位都进位时(例如 [9,9,9]),循环结束后数组首位会变成0,此时需要新建一个长度加一的数组,将第一位设为1,其余位全为0。上面Java代码正是按照这个思路实现的——先处理进位,最后判断首位是否为0,若是则扩容数组。

Python3 解法:

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        """
        :type digits: int
        :return: int
        """
        num = 0
        for i in range(len(digits)):
            num = num*10   digits[i]
        return [int(i) for i in str(num 1)]

Python3 的解法更加灵活。上面这种写法先将整个数组拼接成一个整数,然后加一,再转回字符数组并拆分为列表。思路简单直接,但需要注意:如果数组长度极大(例如几千位),Python 虽然能处理大整数,但转换成字符串再拆分也算一种取巧方式。当然也可以采用类似 Java 的手动进位处理,或者利用 Python 列表的动态特性。

举个例子:可以将数组反转,使用 reversed(digits),然后逐项加一并处理进位,若最后一位仍为0(说明仍需进位),则直接在数组末尾追加一个1,最后再反转回来。因为 Python 列表支持动态扩展,无需像 Java 那样新建固定长度数组,代码写起来更为简洁。

来源:https://developer.aliyun.com/article/704487
上一篇Python基础语法入门学习第一篇 下一篇国内AI技术进步推动表格处理能力再创新高
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
批处理BAT入门教程第一篇
AI教程 · 2026-07-03

批处理BAT入门教程第一篇

提供13个批处理实战技巧,覆盖全盘查找并删除文件夹或文件、拷贝移动文件、创建畸形文件夹及设置隐藏属性等场景,可一键完成系统维护与文件管理工作,极大提升自动化操作效率和便捷性。

从零开始批处理命令For循环详解与实战案例
AI教程 · 2026-07-03

从零开始批处理命令For循环详解与实战案例

批处理For命令支持 d、 l、 r、 f四个参数。 d仅列出当前目录下的目录名; r递归搜索指定路径及其子目录中的文件; l生成数值序列; f可解析文件、字符串或命令输出,通过delims、tokens、skip、eol等选项灵活处理内容。

批评你的人是你生命中的贵人
AI教程 · 2026-07-03

批评你的人是你生命中的贵人

批评你的人往往最值得珍惜,因为他们关注你、助你成长。面对批评应包容反思,用行动改进而非辩解。接受批评是自我完善的过程,能让人少走弯路,避免重复犯错。这样的人正是生命中的贵人,值得感恩与珍惜。

测试人员角色定位与职责详解
AI教程 · 2026-07-03

测试人员角色定位与职责详解

测试人员角色经历了从找问题、保证质量到分析风险的转变,最终核心职责是提供关键信息,协助团队创造优秀产品。这包括识别问题、评估风险及帮助团队了解项目状态,而非单纯把关或追求完美。

经营成功测试生涯的实用方法与策略
AI教程 · 2026-07-03

经营成功测试生涯的实用方法与策略

一、测试生涯的起点 1989年,我在田纳西大学攻读研究生时,意外地从软件开发人员转行成为一名软件测试工程师。这并非我主动选择,说起来还有些戏剧性——某个早晨,教授质问我为何缺席那么多开发会议,我解释说这些会议总是安排在周末早上,对我这个第一次离家、刚入学的学生来说实在不便。结果呢?等待我的不是解聘通