说明:本栏目博客讲解我认为较为优秀的算法思想,希望也能帮到大家,顶峰相见。
第一道题:移动零
思路解析:
本题要求就地将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)的学习干货以及重要代码的分享