力扣题:283.移动零

题目链接283.移动零
题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2

输入: nums = [0]
输出: [0]

思路和算法
说说我的想法吧,我拿到这一题的时候,我想到的是用双指针来实现。一个指针p1用来找到零的位置,一个指针p2用来在p1的基础上找到第一个非零的位置。做这题一开始能通过大部分示例,但是唯独没有想到要加上p1 < p2这个条件来控制p2是要在p1的基础上找到非零位置,导致一部分示例没有通过,脑子还是不太行啊。
我的提交记录

好在头天晚上觉得脑子不是很清醒,就在次日早上起来做了。
代码(c++)

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int p1 = 0; //p1指针先探路,找到零位置
        int p2 = 0; //p2指针在p1的基础上找到第一个非零位置
        int n = nums.size();
        while (p1 < n && p2 < n) {
            if (nums[p1] == 0) {
                if (nums[p2] != 0 && p1 < p2) {
                    swap(nums[p1], nums[p2]);
                    ++p1;
                }
                ++p2;
            }
            else {
                ++p1;
            }
        }
    }
};

做完后,看到官方题解,虽然我和官方用的都是双指针,但是官方的精简且巧妙,把我的改正后,代码如下:
【官方思路:用p2指针探路找到非零位置,然后将对应的值和p1指针所指向的元素值交换,循环限制条件是探路指针p2不能超过数组长度n】

class Solution {
public:
    /**     精简版  */
    void moveZeroes(vector<int>& nums) {
        int p1 = 0; 
        int p2 = 0; //p2指针探路,找到非零位置
        int n = nums.size();
        while (p2 < n) {
            if (nums[p2]) {
                swap(nums[p1], nums[p2]);
                ++p1;
            }
            ++p2;
        }
    }
};

感想:

想的还是不够多,不够全面,有时候不用这么复杂,脑子那根筋稍微转过来一点,就能写出精简版的代码,不得不说精简版的看起来真舒服!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追梦偏执狂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值