本文最后更新于 2024-08-11,文章内容可能已经过时。

题目

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

 

示例 1:

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

示例 2:

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

示例 3:

输入:digits = [0]
输出:[1]

 

提示:

  • 1 <= digits.length <= 100

  • 0 <= digits[i] <= 9

答案代码

"""
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。

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

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

示例 3:
输入:digits = [0]
输出:[1]

提示:
1 <= digits.length <= 100
0 <= digits[i] <= 9
"""


class Solution(object):
    def plusOne(self, digits):
        """
        :type digits: List[int]
        :rtype: List[int]
        """
        #代码1:
        """
        num = 0
        for i in digits:
            num = num * 10 + i
        num += 1
        return [int(i) for i in str(num)]
        """

        #代码2:
        # 从个位开始遍历
        for i in range(len(digits) - 1, -1, -1):
            if digits[i] < 9:
                digits[i] += 1
                return digits
            digits[i] = 0

        # 如果所有位都是9,则需要在最前面添加一位1
        return [1] + digits


if __name__ == '__main__':
    s = Solution()
    print(s.plusOne([1, 2, 3]))

if __name__ == '__main__':
    s = Solution()
    print(s.plusOne([4, 3, 2, 1]))

if __name__ == '__main__':
    s = Solution()
    print(s.plusOne([0]))

结果分析

时间复杂度

循环结构:该函数中有一个从列表末尾到开头的循环,其迭代次数取决于列表 digits 的长度,即 n。因此,最坏情况下需要遍历整个列表,时间复杂度为 O(n)

最好情况:如果列表的最后一个数字不是9,那么只需要执行一次循环体内的操作,时间复杂度为 O(1)

最坏情况:如果列表中的所有数字都是9,那么需要遍历整个列表,时间复杂度为 O(n)

平均情况:平均而言,大约一半的元素会被遍历,因此平均时间复杂度接近 O(n/2),但由于大O表示法忽略常数因子,因此平均时间复杂度仍然记作 O(n)

列表拼接操作:在所有位都是9的情况下,需要创建一个新的列表 [1] 并与原列表拼接。这个操作的时间复杂度为 O(1),因为它只涉及创建一个新的列表并将原列表附加在其后。

综上所述,该函数的时间复杂度为 O(n)

空间复杂度

变量使用:在这个函数中,除了输入的 digits 列表外,没有使用其他额外的数据结构来存储数据。唯一可能增加空间复杂度的操作是在所有位都是9的情况下创建新的列表 [1] 和将原列表附加在其后。

列表拼接操作:在最坏情况下,当所有位都是9时,需要创建一个新列表,其长度为原列表长度加1,即 O(n+1)。然而,在大O表示法中,我们通常只保留最高阶项,因此空间复杂度为 O(n)

综上所述,该函数的空间复杂度为 O(n)