Skip to main content

66.加一

标签: array, math

难度: Easy

通过率: 46.66%

原题链接: https://leetcode.com/problems/plus-one/description/

题目描述

给你一个由整数数组表示的大整数 digits,其中每个 digits[i] 表示整数的第 i 位。数字按从左到右的顺序排列,且不含前导 0。请你将该整数加一,并以数组形式返回结果。

解题思路

这个问题需要在一个按位存储的大整数上加一。当我们执行加一操作时,从最低位开始进位,这类似于我们平常在纸上做加法:

  1. 从数组的最后一位开始,尝试在该位上加一。
  2. 如果这位加一后小于10,则无需再进位,直接返回数组。
  3. 如果加一后等于10(这时该位需要进位),将该位设为0,然后继续计算更高位的进位。
  4. 继续执行上述步骤,直到没有进位为止。
  5. 如果一直进位到最高位(即每一位都是9),我们需要在最前面补一个1,例如999加1后变为1000。

通过这几个步骤,我们能够正确处理所有需要进位的情况。代码只需一次遍历数组,时间复杂度为O(n)O(n)

代码实现

def plusOne(digits):
# 从数组最后一位开始向前遍历
for i in range(len(digits) - 1, -1, -1):
# 当前位加一
digits[i] += 1

# 如果当前位<10,说明不需要进位,直接返回结果
if digits[i] < 10:
return digits

# 如果当前位==10,进行进位操作
digits[i] = 0

# 如果所有位都进位了,例如999变为1000
# 此时我们需要在最前面加一个1
return [1] + digits

复杂度分析

时间复杂度:O(n)O(n),其中nn是数字的位数,即数组长度。我们最多遍历整个数组一次。 空间复杂度:O(1)O(1),不考虑输入输出占用的空间。除非在全部进位的极端情况下,需要额外的常数空间。