给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。
要求:请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。
这道题如果只使用该数组的话,就是一道中等题目了。
class Solution:
def duplicateZeros(self, arr: List[int]) -> None:
"""
Do not return anything, modify arr in-place instead.
"""
# 法一:复制法
# temp = []
# i = 0
# j = 0
# num = len(arr)
# while i < num:
# v = arr[i]
# if v == 0:
# temp.append(0)
# temp.append(0)
# j += 2
# else:
# temp.append(v)
# j += 1
# if j >= num:
# break
# i += 1
# i = 0
# while i < num:
# arr[i] = temp[i]
# i += 1
# # 法二:写入法
# temp = arr[::1]
# i = 0
# j = 0
# num = len(arr)
# while j < num:
# v = temp[i]
# if v == 0:
# arr[j] = 0
# if j + 1 == num:
# break
# arr[j+1] = 0
# j += 2
# else:
# arr[j] = temp[i]
# j += 1
# i += 1
# 法三:双指针
# 右边指针用于记录截断的元素
# 左边指针遍历发现0
# 当左右指针同一个位置的时候,
# 左指针继续遍历元素并从尾部添加到元素中
num = len(arr)
l = 0
r = num
# 计算有效个数
flag = False
while True:
# print(l, r)
if arr[l] == 0:
if l + 1 == r:
# 这种情况需要记录下来,表示只能填充1个0
flag = True
break
else:
r -= 1
if l + 1 == r:
break
l += 1
# print('l, r:', l, r, flag)
# 赋值
i = num - 1
if flag:
arr[i] = 0
i -= 1
l -= 1
while l > -1:
# print(i, l)
if arr[l] == 0:
arr[i] = 0
arr[i-1] = 0
l -= 1
i -= 2
else:
arr[i] = arr[l]
i -= 1
l -= 1
# print(arr)