巧用进位解决加一问题

加一

leetcode 66:加一

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

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
方法一:数学进位

若在循环中返回最终结果,说明只改动已有数组即可。否则,最前面需要添加进位 1。

由于只是加 1,每位的最大值的结果也不超过 10。若等于 10,此时当前位只需改为 0,前面一位继续加一,循环下去。

def plusOne(digits: List[int]) -> List[int]:
    i = len(digits) - 1
    while i >= 0:
        digits[i] += 1
        if digits[i] < 10:
            return digits
        else:   # 需要进位
            digits[i] = 0
            i -= 1
    digits.insert(0, 1)  # 应对出现[9, 9, 9]这样全为9的情况。
    return digits

改为速度更快的 for 循环:

def plusOne(digits: List[int]) -> List[int]:
    for i in range(len(digits) - 1, -1, -1):
        digits[i] += 1
        if digits[i] < 10:
            return digits
        else:
            digits[i] = 0
    return [1] + digits
方法二:list / int / str 相互转换(不推荐)

简洁的做法有以下三种:

  • 使用 map() 函数进行映射:
def plusOne(digits):
    # digits = map(str, digits)  # digits是一个迭代器
    # nums = int(''.join(digits)) + 1  # 转换为整数,并加上1
    # return list(map(int, str(nums)))  # 数变为单个数字的列表
    return list(map(int, str(int(''.join(map(str, digits))) + 1)))
  • 使用 reduce() 函数进行累计:
from functools import reduce

def plusOne(digits):
    s = reduce((lambda x, y: x * 10 + y), digits) + 1
    return list(map(int, str(s)))
  • 使用列表生成式:
def plusOne(digits):
        num = int(''.join(str(n) for n in digits)) + 1
        return [int(n) for n in str(num)]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值