LeetCode刷题|283移动零&66加一

这篇文章记录两道LeetCode官方编辑的初级算法中的数组部分的题目。
首先看第一道题。

移动零

LeetCode刷题|283移动零&66加一
LeetCode地址:移动零
本题要将数组中所有的零移动到数组最后,第一想法当然是冒泡,将每一个零一步一步移动到最后。

冒泡

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        for i in range(0,n):
            for j in range(i+1,n):
                if nums[i]==0:
                    t = nums[j]
                    nums[j] = nums[i]
                    nums[i] = t

冒泡方法很简单,但是时间复杂度为n的平方,因此速度比较慢。冒泡的思想是将零往后移,那么我们反向思考一下,为什么不能将非零元素往前移呢,这就是下面双指针方法的基本思想了。

双指针

初始化两个指针,后面的指针遇到非0元素就跟前面的指针交换位置,前面的指针每次交换完后往前移动一位。

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        n = len(nums)
        left = right = 0
        while right < n:
            if nums[right] != 0:
                nums[left], nums[right] = nums[right], nums[left]
                left += 1
            right += 1

加一

LeetCode刷题|283移动零&66加一
这个题题目有点拗口,简单来讲就是将输入数组视为一个整数,然后将这个整数加一之后再转换为数组。既然这样的话,最简单的当然就是直接法了。

直接法

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        n = len(digits)
        sum = 0
        result = []
        for i in digits:
            sum = sum*10 + i
        sum = sum + 1
        sum = str(sum)
        for i in sum:
            result.append(int(i))
        return result

这里使用了一些python内置函数,实际上这种做法虽然简单,但是我觉得太过于投机取巧。那么就看一下另一种方法。

方法二

方法二的思想在于,当数组最后一位不是9时,那么我们直接把最后一位加一就得到最终结果了,直接返回即可。而当最后一位为9时,就将最后一位置为0,然后往前遍历,如果前面一位不是9,那么就把这一位加一,如果这位还是9的话,就继续重复上一步置0。最后如果遍历结束都没有返回结果,说明数组每一位都是9,那么直接新建一个数组返回就可以了。

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        n = len(digits)-1
        while(n>=0):
            if not digits[n]==9:
                digits[n] = digits[n]+1
                return digits
            digits[n] = 0
            n = n-1
        result = [0]*(len(digits)+1)
        result[0] = 1
        return result
上一篇:LeetCode_17


下一篇:Easy | LeetCode 66. 加一 | 模拟