移动零
1、题目
2、题解
思路1:双指针+两次遍历
创建两个指针a,b,首次遍历用b记录当前的非0元素个数,遇到非0元素就将其左移,遍历完成后b的下表就指向最后一个非0元素下标。第二次遍历,起始位置从b开始到结束,将剩余区域的元素全变为0。
1 2 3 4 5 6 7 8 9 10 11
| class Solution(object): def moveZeroes(self, nums): if not nums: return 0 j = 0 for i in range(len(nums)): if nums[i]: nums[j] = nums[i] j += 1 for i in range(j,len(nums)): nums[i] = 0
|
思路2:双指针+快排
快速排序:首先要确定一个待分割的元素做中间点
X,然后把所有小于等于X的元素放到X的左边,大于X的元素放到其右边。
用0作为中间点,将不等于0的放到中间点左边,等于0的放到中间点右边
1 2 3 4 5 6 7 8 9
| class Solution(object): def moveZeroes(self, nums): if not nums: return 0 j = 0 for i in range(len(nums)): if nums[i]: nums[j],nums[i] = nums[i],nums[j] j += 1
|
思路3:暴力去除0
遍历列表,当元素等于0时,去除该元素并在列表末尾加入0
1 2 3 4 5 6 7 8 9 10 11 12
| class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ len_nums = len(nums) i = 0 while( i != len_nums): if nums[i] == 0: nums.append(0) nums.remove(0) i +=1
|
3、总结
此类不让重新声明数组或者列表的题目通常都涉及到双指针进行解题