题目链接: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;
}
}
};
感想:
想的还是不够多,不够全面,有时候不用这么复杂,脑子那根筋稍微转过来一点,就能写出精简版的代码,不得不说精简版的看起来真舒服!