283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2
输入: nums = [0]
输出: [0]
答案
- 从 0 开始遍历
- 不是 0 则交换
let temp = nums[i]
nums[j] = nums[i]
nums[i] = temp - j++
var moveZeroes = function(nums) {
let j = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] !== 0) {
// 交换位置
let temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
j++;
}
}
return nums
};
var nums = [0,0,1]
moveZeroes(nums)
双指针一次遍历
思路:定义 left、right 指针,right 从左往右移动,遇上非 0 元素,交换 left 和 right 对应的元素,交换之后 left++
复杂度:时间复杂度 O(n),空间复杂度 O(1)
var moveZeroes = function(nums) {
let left=0,right=0
while(right<nums.length){
if(nums[right]!==0){//遇上非0元素,交换left和right对应的元素
swap(nums,left,right)
left++//交换之后left++
}
right++
}
};
function swap(nums,l,r){
let temp=nums[r]
nums[r]=nums[l]
nums[l]=temp
}