移动零
一 :题目
二:思路
双指针法:
两个指针将数组划分成三个部分:
解释:
①:所以一开始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)