共计 698 个字符,预计需要花费 2 分钟才能阅读完成。
起源:力扣(LeetCode)
给定一个数组 nums,编写一个函数将所有 0 挪动到数组的开端,同时放弃非零元素的绝对程序。
示例:
输出: [0,1,0,3,12] | |
输入: [1,3,12,0,0] |
阐明:
- 必须在原数组上操作,不能拷贝额定的数组。
- 尽量减少操作次数。
办法一:快慢双指针
- 快慢指针都从 0 开始
- 当用快指针指向的值不为 0 时,与慢指针替换值
- 慢指针负责指向值为 0 的元素
<img src=”https://pic2.zhimg.com/80/v2-b2d79135af42333c82dc342b14c7ec49_720w.png” alt=”img” style=”zoom:80%;” />
var moveZeroes = function(nums) { | |
let n = nums.length; | |
let slow = fast = 0 | |
while(fast < n) {if (nums[fast] !== 0) {[nums[slow], nums[fast]] = [nums[fast], nums[slow]] | |
slow++ | |
} | |
fast++ | |
} | |
return nums | |
}; |
- 工夫复杂度:
O(n)
- 空间复杂度:
O(1)
办法二:
- 变量
j
负责记录非 0 元素的个数 - 判断以后元素是否为 0,不为 0 时,令下标为
j
的元素等于以后元素 - 最初的后果是所有非 0 的数都往前挪动了,剩下的元素全副赋值 0
var moveZeroes = function(nums) { | |
let j = 0; | |
for (let i = 0; i < nums.length; i++) {if (nums[i] != 0) | |
nums[j++] = nums[i]; | |
} | |
for (let i = j; i < nums.length; i++) {nums[i] = 0 | |
} | |
return nums | |
}; |
正文完
发表至: javascript
2021-04-28