赞
踩
说明:本栏目博客讲解我认为较为优秀的算法思想,希望也能帮到大家,顶峰相见。
思路解析:
本题要求就地将0移到后面,也就是将非零的元素移到前面,因此可以采用双指针法
dest指针代表已经处理过的最后一个位置(从正方向一般都是-1)
cur指针遍历数组(从正方向一般是0)
而这道题不用指针用数组下标即可
代码实现:
- void moveZeroes(int* nums, int numsSize)
- {
- int cur=0;
- int dest =-1;
- //
- while(cur< numsSize)
- {
- if(nums[cur]!=0)
- {
- ++dest;
- int tmp=nums[cur];
- nums[cur]=0;
- nums[dest]=tmp;
- }
- ++cur;
- }
- }
思路讲解:
这道题如果从开头进行原地复写便会将下面的有效数据覆盖,从而从队尾写起,但要先确定从队尾的哪个开始写起,巧妙运用双指针的方法。
注意:找最后一个要写的数时dest有两种位置,要去先处理一下。
代码实现:
- class Solution {
- public:
- void duplicateZeros(vector<int>& arr)
- {
- int cur=0;
- int dest=-1;
- int n =arr.size();
- //先找到最后一个要写的数
- while(cur< n)
- {
- if(arr[cur])
- {++dest;}
- else
- {dest+=2;}
- if(dest>= n-1) break;//dest>=n-1就结束了
- ++cur;
- }
- //处理dest>end的情况
- if(dest == n)
- {
- --cur;
- arr[n-1]=0;
- dest-=2;
- }
- while(cur>=0)
- {
- if(arr[cur])
- {
- arr[dest--]= arr[cur--];
- }
- else
- {
- arr[dest--]=0;
- arr[dest--]=0;
- --cur;
- }
- }
- }
- };
这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助❤
欢迎各位点赞,收藏和关注哦❤
如果有疑问或有不同见解,欢迎在评论区留言哦❤
后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。