解题过程
:::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的元素位置上或遍历结束
