移动零
- 电脑硬件
- 2025-09-17 19:33:03

一 :题目 二:思路
双指针法:
两个指针将数组划分成三个部分:
解释:
①:所以一开始dest要等于-1,因为没有非零的元素,cur=0,因为要从头开始遍历数组
②:cur为0,则不管,自己++
③:cur不为0,则这个非零的元素要放在第一部分中,而dest是指向的非零元素的最后一个,所以dest+1,然后和cur指向的元素交换,然后再将dest++(前面的dest+1并不会影响dest自身),cur++
三:代码实现
①:易懂写法
class Solution { public: void moveZeroes(vector<int>& nums) { int cur = 0; int dest =-1; for(;cur<nums.size();cur++) { if(nums[cur]!=0)//对非零元素处理 { swap(nums[cur],nums[dest+1]); dest++; } } } };解释:
a:为什么只对cur遇到非零元素的时候进行处理,因为for循环里面的cur++,已经对0元素进行了处理(我们的思路就是cur遇到0,则cur++)
b:为什么dest还要++,因为dest+1不会影响自身
②:精简写法
class Solution { public: void moveZeroes(vector<int>& nums) { for( int dest = -1,cur = 0;cur<nums.size();cur++) { if(nums[cur]!=0) { swap(nums[cur],nums[++dest]); } } } };解释:
a:++dest,综合了dest+1和cur交换,然后dest++这两步
题目网址:283. 移动零 - 力扣(LeetCode)