66. 加一(LeetCode)

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

分析:
本题的关键是“进位”,如果最后一个数字加一是小于10 的数字,则只需要将数组的最后一个元素加一即可。关键是面对进位如何处理?
例如:99,如何转为100?

方法一:
通过将数组中的数字转换为具体意义中的数字后,作加一的运算,再将得到后的数字转换为数组的形式。

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        sums = 0
        # 首先计算得出数组中存储的数字本身
        for i in range(len(digits)):
            sums += 10**(len(digits)-1-i)*digits[i]
        # 将数字转换为字符串
        sums_str = str(sums + 1)
        # 将字符串再次转换为列表
        return [int(j) for j in sums_str]

方法二:
直接在数组中进行加一的操作。首先按照从尾到头的顺序判断是否等于九,再分别做相应的处理。

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
    	# 从尾到头遍历
        for i in range(len(digits)-1, -1, -1):
            # 判断如果不等于9,返回加一后的数字
            if digits[i] != 9:
                digits[i] += 1
                return digits
            # 如果等于九,令这一位置元素为0,继续判断上一个元素的值
            digits[i] = 0
        # 如果上方元素都等于9,令第一个元素为1,并且在元组后面再加一个0.
        digits[0] = 1
        digits.append(0)
        return digits

结论:本题的关键是处理临界点数字9,两种方法分别在数字和列表的角度进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值