给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。
要求:请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。
输入:[1,0,2,3,0,4,5,0] 输出:null 解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]
输入:[1,2,3] 输出:null 解释:调用函数后,输入的数组将被修改为:[1,2,3]
代码:
暴力解法:按照题目要求,使用一个while循环对列表进行遍历
小技巧:这里的下标从1开始,从前一位判断是否等于0,更方便去写逻辑,同时不用担心i会越界的问题
当前一位等于0的时候,指针i会向后移两位,因为你在0后面补充了一个0,所以才会移动两位
class Solution:
def duplicateZeros(self, arr: List[int]) -> None:
if 0 not in arr:
return None
i=1
N = len(arr)
while i < N:
if arr[i-1] ==0:
arr[i+1:N]=arr[i:N-1]
arr[i]=0
i+=2
else:
i+=1
使用python自带的函数(不必重复遭车轮,会用就行):
思路是使用list自带的insert函数,遍历整个列表,当遇到0的时候,就在后面补充一个0,然后使用pop函数,删除最后一个元素
可能会有这样的疑问,这里为什么是i+=1,注意,下面的i+=1区别于第一种思路,没有写在else里面,也就是说无论如何都会后移一次,当前为0的时候,if里面移动一次,外面又移动一次,所以是两次,其实和上面的写法一样。
(推荐上面一种if-else的写法,好理解一些,下面的虽然简洁,但是需要时间思考一下,不是很直观)
class Solution:
def duplicateZeros(self, arr: List[int]) -> None:
i=0
while i <len(arr):
if arr[i]==0:
arr.insert(i+1,0)
arr.pop()
i+=1
i+=1