80 - 移动零
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
解答
要做两件事:
把非零元素挪动到前面
把后面的元素全部变成0
题解是保留了一个指针,记录最后的那个非零元素位置。
var moveZeroes = function (nums) {
let last = 0
for (let i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[last] = nums[i]
last++
}
}
for (let i = last; i < nums.length; i++) {
nums[i] = 0
}
};
Runtime: 60 ms, faster than 83.60% of JavaScript online submissions for Move Zeroes.
Memory Usage: 35.8 MB, less than 36.17% of JavaScript online submissions for Move Zeroes.
题解里面的做法:
nums[last++] = nums[i]
就相当于
nums[last] = nums[i]
last++
因为这个放在后面的++
,是表达式结束后才+的。
不过感觉难以理解,就拿出来了。
func moveZeroes(nums []int) {
last := 0
for i := 0; i < len(nums); i++ {
if nums[i] != 0 {
nums[last] = nums[i]
last++
}
}
for i := last; i < len(nums); i++ {
nums[i] = 0
}
}
Runtime: 64 ms, faster than 77.91% of Go online submissions for Move Zeroes.
Memory Usage: 7.9 MB, less than 60.00% of Go online submissions for Move Zeroes.
一口气解决
还是双指针,如果不是0,就交换一下
我一开始想法也这样,咋就只能写出死循环呢😂😂
var moveZeroes = function (nums) {
for (let last = 0, cur = 0; cur < nums.length; cur++) {
if (nums[cur] != 0) {
[nums[last], nums[cur]] = [nums[cur], nums[last]]
last++
}
}
};
Runtime: 60 ms, faster than 83.60% of JavaScript online submissions for Move Zeroes.
Memory Usage: 36.5 MB, less than 8.51% of JavaScript online submissions for Move Zeroes.
func moveZeroes(nums []int) {
last := 0
for cur := 0; cur < len(nums); cur++ {
if nums[cur] != 0 {
nums[last], nums[cur] = nums[cur], nums[last]
last++
}
}
}
Runtime: 60 ms, faster than 97.09% of Go online submissions for Move Zeroes.
Memory Usage: 7.7 MB, less than 100.00% of Go online submissions for Move Zeroes.
go好像没法在for里面定义两个变量😂
Last updated
Was this helpful?