刷题笔记-66. 加一

107 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

一、题目描述:

66. 加一 - 力扣(LeetCode) (leetcode-cn.com)

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

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

你可以假设除了整数 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

二、思路分析:

算法1: 计算进位

  • 预处理简单情况。若每位都是9,直接返回计算结果。
  • 处理其他情况。从个位向前遍历,逢9进位,直到第一个不需进位的位置,加一后返回结果。

算法2:转换为字符串处理

  • 计算出数值,加一
  • 转化为字符串输出
  • 简单直接,就是会比方法1慢...

三、AC 代码:

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        
        if sum(digits)/len(digits) == 9: # 若每位都是9,直接返回结果
            return [1] + [0] * len(digits)


        else:
            for i in range(len(digits)-1, -1, -1): # 从个位向前遍历,步幅为-1,直到0(含)
                if digits[i] == 9: # 遇9进位,不论多少位...
                    digits[i] = 0
                else: # 遇到第一个不需要进位的位置,加一(上一位的进位),返回结果
                    digits[i] = digits[i] + 1
                    return digits


class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:

        if digits[-1] < 9:  # 如不需进位,直接计算,返回
            digits[-1] = digits[-1] + 1
            return digits

        if sum(digits) / len(digits) == 9:  # 若每位都是9,直接返回结果
            return [1] + [0] * len(digits)

        # 计算x的数值
        x, m = 0, len(digits)
        for i in range(m):
            x = x + digits[i] * 10 ** (m - i - 1)

        x = x + 1
        x_str = str(x)  # 转换为字符串再返还给数组
        for i in range(len(digits)):
            digits[i] = int(x_str[i])
        return digits

范文参考:

【数据结构和算法】加一,击败了100%的用户 - 加一 - 力扣(LeetCode)

c#解法,执行用时 : 276 ms , 在所有 C# 提交中击败了 90.99% 的用户 - 加一 - 力扣(LeetCode)