目录
题目
-
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
法一、暴力法
- 遍历找到零元素,并暂时保存,然后在零元素往后的都前移一位,最后在给最后一位赋给暂存的值
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
for i in range(n):
if nums[i] == 0:
for j in range(i+1,n):
nums[j-1] = nums[j]
j += 1
nums[n-1] = 0
i +=1
- 错误:当测试用例刚好有两个挨着的0元素时就会报错。
- 原因:当遇到第一个0元素时,0元素后面的依次往前一位,最后一位补0,然后进行i+1进行判断,此时,第二个0元素补在了一个0元素原来的位置,i+1直接跳过了第二个0元素的判断,导致出错。
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
i = 0
while i < n:
if nums[i] == 0:
for j in range(i+1, n):
nums[j-1] = nums[j]
nums[n-1] = 0
if nums[i] != 0 and i > 0:
i += 1
else:
i = i
if i < 0: # 处理i小于0的情况
i = 0
else:
i += 1
- 超出时间限制
- 该方法没有成功解决问题,欢迎大家多多指教
法二、双指针
class Solution:
def moveZeroes(self, nums):
i = 0
j = 0
n = len(nums)
for i in range(n):#把数组中不是0元素的往前移
nums[j] = nums[i]
if nums[i] != 0:#当元素不为0时j才往后移一位,,是0时不动等着nums[j] = nums[i]不为0的替代
j += 1 #j最终停在最后一个不为0的元素
while j < n:#剩余的位置全部补0
nums[j] = 0
j += 1
法三、pop+append
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
n = len(nums)
i = 0
while i < n:
if nums[i] == 0:
nums.pop(i)#将其从数组中移除
nums.append(0)#将零追加到数组的末尾
n -= 1#由于零元素已经被移动到末尾,所以数组的长度 n 减 1
else:#如果当前元素不是零
i += 1#则将索引 i 的值增加 1,以继续下一轮迭代
标签:nums,元素,len,range,moveZeroes,数组,283,移动
From: https://www.cnblogs.com/lushuang55/p/17777357.html