Leetcode Link: 1089. 复写零 - 力扣(LeetCode)

题目

给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。

要求:请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

解法一

思路:自己想的暴力,开辟一个新的数组,两个指针一起走,不断把新的值更新到原来的 arr 中

题解

class Solution:
    def duplicateZeros(self, arr: List[int]) -> None:
        """
        Do not return anything, modify arr in-place instead.
        """
        copy = arr.copy()
        i = 0
        j = 0
        while(j<len(arr)):
            if copy[i] == 0:
                arr[j] = 0
                if j + 1 < len(arr):
                    arr[j+1] = 0
                i+=1
                j+=2
            else:
                arr[j] = copy[i]
                i+=1
                j+=1

解法二

思路:直接用内置的,骚点

题解

class Solution:
    def duplicateZeros(self, arr: List[int]) -> None:
        """
        Do not return anything, modify arr in-place instead.
        """
        i=0
        while(i<len(arr)):
            if arr[i] == 0:
                arr.insert(i+1, 0)
                arr.pop()
                i+=2
            else:
                i+=1

解法三

思路:双指针原地

请查看该题解的动画,十分清晰,但是有点难想难理解,溜了溜了

class Solution:
    def duplicateZeros(self, arr: List[int]) -> None:
        i, j, k = 0, len(arr) - 1, len(arr) - 1
        while i < j:
            if arr[i] == 0:
                j -= 1
            i += 1
 
        # 此处特判需要读者多加思考
        if i == j and arr[i] == 0:
            arr[k] = arr[j]
            j,k = j-1,k-1
 
        while j >= 0:
            if arr[j] == 0:
                arr[k] = 0
                k -= 1
            arr[k] = arr[j]
            j,k = j-1,k-1
 

题解

启发和联系