Javascript 为什么';我的MoveZeroes代码是否修改输入数组?

Javascript 为什么';我的MoveZeroes代码是否修改输入数组?,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我试图在JS中解决以下leetcode问题: 挑战如下: 给定一个数组nums,编写一个函数将所有0移动到它的末尾,同时保持非零元素的相对顺序 1.必须在不复制阵列的情况下就地执行此操作 2.尽量减少操作总数 例如: Input: [0,1,0,3,12] Output: [1,3,12,0,0] 在我的代码中,我在函数结束之前在控制台上获得了所需的输出,但是它被拒绝了,我想了解原因 这是我的代码: /** * @param {number[]} nums * @return {void}

我试图在JS中解决以下leetcode问题:

挑战如下: 给定一个数组
nums
,编写一个函数将所有
0
移动到它的末尾,同时保持非零元素的相对顺序

1.必须在不复制阵列的情况下就地执行此操作

2.尽量减少操作总数

例如:

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]
在我的代码中,我在函数结束之前在控制台上获得了所需的输出,但是它被拒绝了,我想了解原因

这是我的代码:

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */

var moveZeroes = function(nums) {
    let i = 0
    let length = nums.length
    while (i < length){
        if(nums[i] === 0) {
            nums = nums.slice(0, i).concat(nums.slice(i+1),0)
            length--
            continue;
        }
        length--
        i++
    }
    console.log(nums) //logs the desired result
};
/**
*@param{number[]}nums
*@return{void}不返回任何内容,改为就地修改NUM。
*/
var moveZeroes=函数(nums){
设i=0
let length=nums.length
while(i
我见过类似的问题:

  • 所以,我知道这可能是重复的,但我希望能直接反馈我的代码。谢谢

    nums=nums.slice(0,i).concat(nums.slice(i+1),0)


    此行将nums变量分配给具有所需内容的新数组。但是原始数组保持不变。

    您的代码违反了第一条规则:

    必须在不复制阵列的情况下就地执行此操作

    两者都返回一个新数组,这意味着复制原始数组


    您可以使用shift()、unshift()、sort()。。。或者交换元素值,就像其他人提到的那样,这些元素值改变了原始数组,您的使用违反了问题的约束。引用Mozilla开发者网络页面中关于这些功能的某些特定部分:

    • Array.slice(…)
      :“slice()方法将数组部分的浅拷贝返回到新的数组对象中…”
    • Array.concat(…)
      :“concat()方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组[强调添加]”

    我强烈建议使用for this,它不仅可以用于删除数组的子部分,还可以用于向数组中插入新元素,同时修改数组。这种多功能性允许
    Array.splice(…)
    作为
    Array.concat()
    Array.slice()

    的就地替代品,但通过将其保存到同一nums数组,它不会被覆盖吗?这可能是变量101,但我认为我使用的是相同的nums。@DavidAguirreL它实际上会覆盖原始数组;数组只是memery中的一个引用,您创建的每个新数组都会有一个新引用是的,slice会创建一个新的引用,但时间复杂性无论如何都不会被接受。只需使用一个简单的指针和交换。在这里查看我的解决方案。是的,谢谢!我认为我的错误是,通过将计算(concat和slice)分配给
    nums
    我覆盖了原始数组,但我只是覆盖了函数中nums的本地副本。所以基本上,我的错误与变量的工作方式有关。或者这就是我现在理解的。