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
题解: