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

代码:

方法一:暴力解法

 1 /**
 2  * @param {number[]} nums
 3  * @return {void} Do not return anything, modify nums in-place instead
 4  */
 5 var removeZero = function(nums) {
 6     var count = 0;
 7     for (var i = 0; i < nums.length; i++) {
 8         if (nums[i] === 0) {
 9             nums.splice(i, 1);
10             count++;
11             i--;
12         }
13     }
14     for (var j = 0; j < count; j++) {
15         nums.push(0);
16     }
17 };

 方法二:双指针

思路:定义left、right指针,right从左往右移动,遇上非0元素,交换left和right对应的元素,交换之后left++

时间复杂度:O(n)

空间复杂度:O(1)

 1 /**
 2  * @param {number[]} nums
 3  * @return {void} Do not return anything, modify nums in-place instead
 4  */
 5 var moveZeroes = function(nums) {
 6     let left = 0,
 7         right = 0;
 8     while (right < nums.length) {
 9         if (nums[right] !== 0) {
10             swap(nums, left, right);
11             left++;
12         }
13         right++;
14     }
15 }
16 
17 function swap(nums, l, r) {
18     let temp = nums[r];
19     nums[r] = nums[l];
20     nums[l] = temp;
21 }

 

posted @ 2021-05-19 23:00  icyyyy  阅读(81)  评论(0)    收藏  举报