LeetCode-66 加一

题目

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

示例 1:

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

解法一

思路

将数组中的每一个字符连接成一个字符串; 然后字符串转换为整数,再将数字增加1; 分割数字,组成另一个数组

代码

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        num = ""
        for i in digits:
           num += str(i)
        num = str(int(num) + 1)

        ans = []
        for i in num:
            ans.append(int(i))

        return ans

复杂度

空间:O(n) 时间:O(n)

解法二

思路

和第一种思路类似 遍历数组,将数组变成数字形式 新数字加一 分割数字,组成另一个数组

代码

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        intNum = 0
        for i in range(len(digits)):
            intNum = intNum*10 + digits[i]        
        intNum += 1

        res = []
        for i in str(intNum):
            res.append(int(i))
        
        return res

复杂度

空间:O(n) 时间:O(n)

解法三

思路

换个思路,加一无非两个情况

  • 末位为 9 需要进位
  • 末位不为 9,直接加一
  1. 首先设边界条件,若无数字则为一
  2. 末位为 9:
  • 截取除最后一位外的数组,末位加一
  • 新数组结尾填零
  1. 末位不为 9: 末位直接加一

代码

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        if len(digits) == 0:
                digits = [1]
        elif digits[-1] == 9:
            digits = self.plusOne(digits[:-1])
            digits.extend([0])
        else:
            digits[-1] += 1
        return digits

为了好理解些,解释下代码 digits = self.plusOne(digits[:-1]) 示例:

digits = [9, 0, 9]
# digits = [9, 0, 9]
digits = self.plusOne([9, 0]) # this returns [9, 1]
# digits = [9, 1]
digits.extend([0])
# digits = [9, 1, 0]

复杂度

时间:O(n) 空间:O(1)

Last Updated: