【二刷力扣】【力扣热题100】今天的题目是:283.移动零
题目:
给定一个数组 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
解答:
思路:
首先我想到的就是swap进行交换,因为数组元素的顺序不能改变,只能让零移动全部到后面。
换个想法,其实就是想让非零元素全部按原来的顺序全部排列在数组前,那么就可以直接一个for循环遍历,只要是非零元素就进行swap,遍历一遍就会将非零元素置换到前面。
元素是零,就会用res标记下标,与下一个非零元素进行swap,这样遍历一遍,零元素会慢慢全部排序在后面,非零元素排列在前面。
代码如下:
class Solution {
public:void moveZeroes(vector<int>& nums) {int res=0;for(auto & it : nums){if(it!=0){ //如果数组中,当前元素不为0,就和后一个元素交换swap(it,nums[res]);res++;}}}
};
// 0 1 0 3 12 res=0
// 1 0 0 3 12 res=1
// 1 3 0 0 12 res=2
// 1 3 0 0 12 res=3
// 1 3 12 0 0 res=4