解题过程
:::info
题目链接
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
:::
/**
* @link https://leetcode.cn/problems/move-zeroes/
* @title 283. 移动零
* @description 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
* 请注意 ,必须在不复制数组的情况下原地对数组进行操作
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
// 解法一
// 思路:新增两个数组新,一个存储0,一个存储其他数字,循环遍历原数组,判断当前位置元素值是否为0,为0添加到村粗0的数组,不是则添加到非0数字数组
// ❌然后提交代码,傻眼了,题目意思是直接操作元素组值
// var moveZeroes = function (nums) {
// const zeros = []
// const others = []
// for (let i = 0; i < nums.length; i++) {
// if (nums[i] === 0) {
// zeros.push(0)
// } else {
// others.push(nums[i])
// }
// }
// return [...others, ...zeros]
// }
// 解法二:
// 💡思路:想到了排序sort,只需判断下一项b值是否为0,为0则排在a的后面,非0则位置保持不变即可
var moveZeroes = function (nums) {
nums.sort((a, b) => b === 0 ? -1 : 0)
console.log(nums)
}
// 解法三:
// 💡思路:循环交换位置方法,循环遍历数组,就是当前元素值不为0时且索引大于0,再嵌套一个循环,以i为开始递减j跟上一个元素值为0的交换位置,直到上一个元素不为0或j等于0结束
var moveZeroes = function (nums) {
for (let i = 0; i < nums.length; i++) {
if (nums[i] !== 0 && i > 0) {
for (let j = i ; j > 0; j--) {
if (nums[j - 1] === 0) {
const temp = nums[j - 1]
nums[j - 1] = nums[j]
nums[j] = temp
}
}
}
}
console.log(nums)
}
moveZeroes([0, 1, 0, 3, 12]) // [1,3,12,0,0]
// moveZeroes([0]) // [0]
// moveZeroes([0, 0, 1]) // [1, 0, 0]
解题感受
一开始思路想错了,误解了题干原数组操作关键词的理解,后面想了一种偷懒的写法通过sort直接数组排序就可以解决,后面又想到了位置元素值交换法,但是就是操作次数比较多,原理就是不为0的元素值时,将该元素值通过交换位置的方式提前,直到上一个元素不为0的元素位置上或遍历结束