66. 加一

发布时间 2023-10-20 14:47:35作者: Frommoon

1.题目

  • 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
    最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
    你可以假设除了整数 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]

法一、for+if

  • 思路:定位到数组的最后一位,如果是0-8就直接最后一位+1,如果是9,就让最后一位为0

  • 错误原因:未考虑到全部为9的特殊情况以及数组只有一个元素的情况(数组长度需要+1)

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        n = len(digits)
        for i in range (n):
            if i != n-1:
                i += 1
            else:
                if digits[i] >= 0 and digits[i] <= 8:
                    digits[i] = digits[i] + 1
                else :
                    digits[i] = 0
                    digits[i-1] = digits[i-1]+1
        return digits   
  • 正确解法:
 class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        n = len(digits)
        
        # 从列表的最后一位开始遍历
        for i in range(n-1, -1, -1):#从n-1开始,每次递减1,递减到最后一位(也就是0)
            # 如果当前数字小于 9,则直接加一并返回结果
            if digits[i] < 9:
                digits[i] += 1
                return digits
            # 如果当前数字等于 9,则将其设为 0,继续循环处理前一位数字
            digits[i] = 0
        # 如果遍历完整个列表后仍然没有返回结果,则说明需要进位,需要在列表的最前面插入一个 1
        digits.insert(0, 1)
        return digits

法二、利用字符串特性

  • 思路:将列表 digits 中的每个元素转换为字符串,并将它们按顺序拼接起来形成一个字符串。然后,将这个字符串转换为整数,加一,再将结果转换为字符串。最后,遍历这个字符串的每个字符,并将每个字符转换为整数,添加到列表 l 中。最终,返回列表 l 作为加一后的结果。
class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        s = '' 
        l = []
        for i in digits:
            s = s + str(i)  # 将列表中的每个元素转换为字符串,并拼接起来
        for n in str(int(s) + 1): # 将拼接后的字符串转换为整数,加一,然后再将结果转换为字符串
            l.append(int(n)) #然后遍历该字符串的每个字符,并将每个字符转换为整数,添加到列表 l 中
        return l