Python每日一练-----加一

(day28)

🖍题目:

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

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

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

说明:输入数组表示数字 0。

题目分析:

对于操作方法,本题主要考察列表,字符串和数值间的相互转化。涉及到的转换发方法我们下面分析(了解更多:这些实用的列表,字符串操作你知道吗

解题思路:

解法一:直观解法

我们可以直接遍历digits列表,提取出每个元素,根据列表长度判断每个数所在位置所有的单位。

如digits = [1, 2, 3]

digits长度为3,1在百位,2在十位,3在个位

那么我们只需要根据数字所在位置不同将其乘上10的倍数即可。

再将所得的数加1即可得到结果数

因为题目要求以列表的形式输出,那么我们可以创建一个空列表,然后遍历结果数将其一个一个加入空列表

但是数值是不能直接遍历的,我们需要将数值用str()函数转换成字符串,遍历后再将其用int()函数转化成数值后加入空列表即可

🌈代码实现

def plusOne(digits):
    number = 0
    lst = []
    n = len(digits)
    for i in range(n):
        if i != n-1:
            number += digits[i] * (10 ** ((n - 1) - i))
        else:
            number += digits[i] + 1

    for j in range(len(str(number))):

        lst.append(int(str(number)[j]))
    return lst

🌟代码注释

def plusOne(digits):
    # 初始化
    number = 0  
    lst = []
    n = len(digits)
    for i in range(n):
        """
        根据下标确定数字的单位,但是当i为n-i(最后一位数的下标)时,
        ((n - 1) - i)=0,所以我们分i != n-1和i = n-1两类讨论
        """
        if i != n-1:   
            number += digits[i] * (10 ** ((n - 1) - i))
        else:
            number += digits[i] + 1

    for j in range(len(str(number))):  # 这里的number是数值没有len()属性,所以需要用str()先将其转换成字符串
        
        """这里的number是数值不能直接遍历,需要用str()先将其转换成字符串,接着再用int()将其转换成数值加入空列表"""
        lst.append(int(str(number)[j]))  
    return lst

解法二:

看完解法一,两个字形容:麻烦

那么有没有更简便的方法?

当然有,我们回到题目。

题目要求将这个数加一,那么我们知道,digits的最后一位数时个位数。那么我们直接将digits最后一位数加一不就好了

但是我们考虑到最后一位数可能为9,9+1=10,最后一位数变为10有两位数字,违反了题目数组中每个元素只存储单个数字的规则所以,我们需要将倒数第二位加一,然后将最后一位数变为0

我们又考虑到digits倒数第二位数也可能为9,那么我们需要将倒数第三位加一,然后将最后一位数和倒数第二位变为0

以此类推,当digits都为含有的数都为9时,我们需要增添列表长度(增长一个单位),然后将digits中所有的9变成0

🌈代码实现

def plusOne(digits):
    i = -1
    while i >= -len(digits):
        if digits[i] != 9:
            digits[i] += 1
            return digits
        else:
            digits[i] = 0
        i -= 1
    return [1] + digits

🌟代码注释

def plusOne(digits):
    i = -1  # 初始化i=-1,为后面digits[i] += 1做准备
    while i >= -len(digits):  
        if digits[i] != 9:  # 对于加一后不满10的情况
            digits[i] += 1
            return digits
        else:   # 加一后满10的情况则将对应位置上的数该为0后
            digits[i] = 0
        i -= 1    # 改变i的值,进一步判断该位子上的数加1是否满10
    return [1] + digits  # while循环无结果返回说明digit含有的数字都为9,列表长度需要增1

今天就到这,明天见。🚀

❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄end❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亖夕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值