给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]
输出:[0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
思路:
一眼双指针,开始的时候没有理解好,以为是要保持顺序排列,结果就先排序在进行操作,结果出错了,提交之后就发现没有理解好题目。之后用双指针,一个指向 0 ,一个指向非0,不一样就换,思想就是找0,不原地换,后边看题解还可以找非零,相同的位置可以进行交换,这是我不了解的。正好就整理一下,本来不想整理的。(ps:没发不代表没做,只是觉得简单没有整理)
代码如下:
class Solution {
public:
// void moveZeroes(vector<int>& nums) {
//1.自己写的
// int j=0;
// while(j<nums.size()){ //找到第一个非零
// if(nums[j]==0) break;
// j++;
// }
// int i = j+1;
//如果没有0元素,就直接到这里就结束了
// while(i<nums.size()){
// if(nums[j]==0&&nums[i]!=0){
// swap(nums[j],nums[i]);
// j++;
// }
// i++;
// }
// }
void moveZeroes(vector<int>& nums) {
//2.题解 找非零,相同位置交换
int n = nums.size(), left = 0, right = 0;
while (right < n) {
if (nums[right]) {
swap(nums[left], nums[right]);
left++;
}
right++;
}
}
};