主页 > 电脑硬件  > 

移动零

移动零
一 :题目

二:思路

双指针法:

两个指针将数组划分成三个部分:

解释:

①:所以一开始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)

标签:

移动零由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“移动零