目录
问题描述:
思路1.
思路1:建立一个index,每次往后移动一个位置,若遇到0直接在他后面insert一个0,再pop掉最后一个元素,
并跳过插入的0。终止条件为index大于数组长度
代码:
class Solution(object):
def duplicateZeros(self, arr):
"""
:type arr: List[int]
:rtype: None Do not return anything, modify arr in-place instead.
"""
i=0
n=len(arr)
while i<n:
if arr[i]==0:
arr.insert(i,0)
arr.pop()
i+=2
continue
i+=1
print(arr)
结果:
思路2:
思路二:采用双指针
建立两个指针l和r
l: 初值为0,用于从左边遍历元素,如果碰到0时则需要将r减去1表示舍弃一个元素为复制0腾出空间。
r:初值为n,用于从数组尾部开始,指向下一个即将被抛弃的元素。
终止条件:l>r
另外:
当l==r:最后一个0的话它是不要复制的,所以直接搬过去
代码:
class Solution(object):
def duplicateZeros(self, arr):
"""
:type arr: List[int]
:rtype: None Do not return anything, modify arr in-place instead.
"""
n=len(arr)
l=0
r=n-1
k=r
while l<=r:
if arr[l]==0:
if l==r:#最后一个0的话它是不要复制的,所以直接搬过去
arr[k]=0
k-=1
r-=1
break
r-=1
l+=1
while r>=0:
if arr[r]==0:#如果当前元素为0,k位置复制0,k--
arr[k]=0
k-=1
#swap
arr[k]=arr[r]
r-=1
k-=1