持续创作,加速成长!这是我参与「掘金日新计划 · 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 <= 1000 <= 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)