解题过程

:::info 题目链接
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。 :::

  1. /**
  2. * @link https://leetcode.cn/problems/move-zeroes/
  3. * @title 283. 移动零
  4. * @description 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
  5. * 请注意 ,必须在不复制数组的情况下原地对数组进行操作
  6. * @param {number[]} nums
  7. * @return {void} Do not return anything, modify nums in-place instead.
  8. */
  9. // 解法一
  10. // 思路:新增两个数组新,一个存储0,一个存储其他数字,循环遍历原数组,判断当前位置元素值是否为0,为0添加到村粗0的数组,不是则添加到非0数字数组
  11. // ❌然后提交代码,傻眼了,题目意思是直接操作元素组值
  12. // var moveZeroes = function (nums) {
  13. // const zeros = []
  14. // const others = []
  15. // for (let i = 0; i < nums.length; i++) {
  16. // if (nums[i] === 0) {
  17. // zeros.push(0)
  18. // } else {
  19. // others.push(nums[i])
  20. // }
  21. // }
  22. // return [...others, ...zeros]
  23. // }
  24. // 解法二:
  25. // 💡思路:想到了排序sort,只需判断下一项b值是否为0,为0则排在a的后面,非0则位置保持不变即可
  26. var moveZeroes = function (nums) {
  27. nums.sort((a, b) => b === 0 ? -1 : 0)
  28. console.log(nums)
  29. }
  30. // 解法三:
  31. // 💡思路:循环交换位置方法,循环遍历数组,就是当前元素值不为0时且索引大于0,再嵌套一个循环,以i为开始递减j跟上一个元素值为0的交换位置,直到上一个元素不为0或j等于0结束
  32. var moveZeroes = function (nums) {
  33. for (let i = 0; i < nums.length; i++) {
  34. if (nums[i] !== 0 && i > 0) {
  35. for (let j = i ; j > 0; j--) {
  36. if (nums[j - 1] === 0) {
  37. const temp = nums[j - 1]
  38. nums[j - 1] = nums[j]
  39. nums[j] = temp
  40. }
  41. }
  42. }
  43. }
  44. console.log(nums)
  45. }
  46. moveZeroes([0, 1, 0, 3, 12]) // [1,3,12,0,0]
  47. // moveZeroes([0]) // [0]
  48. // moveZeroes([0, 0, 1]) // [1, 0, 0]

解题感受

一开始思路想错了,误解了题干原数组操作关键词的理解,后面想了一种偷懒的写法通过sort直接数组排序就可以解决,后面又想到了位置元素值交换法,但是就是操作次数比较多,原理就是不为0的元素值时,将该元素值通过交换位置的方式提前,直到上一个元素不为0的元素位置上或遍历结束

优质解题参考