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最后一位数加一不就好了

Python每日一练-----加一_第1张图片

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

Python每日一练-----加一_第2张图片

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

Python每日一练-----加一_第3张图片

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

Python每日一练-----加一_第4张图片

代码实现

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❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄

你可能感兴趣的:(力扣每日一卷,python,学习,力扣刷题)