在javascript中将零移到数组的末尾 - 如何不返回任何内容?

rob*_*bby 1 javascript arrays algorithm

我正在尝试用 JS完成leetcode.com 的问题。我一般不熟悉算法,并且在我的第一次提交被接受时遇到了一些麻烦。

该问题规定了以下内容:

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

例如,给定nums = [0, 1, 0, 3, 12],在调用您的函数后,nums应该是[1, 3, 12, 0, 0]

注意:您必须就地执行此操作,而无需复制阵列。尽量减少操作总数。


有了这个,这是我的代码:

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    var i, temp;

    for (i = 0; i < nums.length-1; i++) {
        if(nums[i] === 0) {
            temp = nums.splice(i, 1);
            nums.push(temp[0]);
        }
    }
    return null;
};
Run Code Online (Sandbox Code Playgroud)

代码示例顶部的注释是在他们的文本编辑器中提供的,这让我相信我不应该提供任何 return 语句。尽管他们网站上的验证器似乎根本不想接受这一点,但我开始返回 null ...

当我nums在处理输入后登录到控制台时,我看到了所需的结果nums = [1, 3, 12, 0, 0]。不管怎样,我的回答总是被拒绝。我很想知道我在这里做错了什么,所以我可以解决它。

我知道这可能是重复的。我看到其他关于 C 和 Java 的响应,但我没有看到处理 JS。

epa*_*llo 11

问题与返回语句无关,问题是您的算法错误。

[0,0,1,2,3] 将返回 [0,1,2,3,0]

当您沿正方向循环并删除索引时,您会在下一个索引向下滑动到您已经覆盖的位置时跳过索引。

你需要在负方向循环。从最后开始,然后走到起点。

for (i = nums.length-1; i>=0; i--) {
Run Code Online (Sandbox Code Playgroud)


小智 9

这是该问题的 O(n) 解决方案:

var moveZeroes = function (nums) {
  let count = 0;
  
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] !== 0) {
      nums[count++] = nums[i];
    }
  }

  for (let i = count; i < nums.length; i++) {
    nums[i] = 0;
  }
  
  return nums;
};
Run Code Online (Sandbox Code Playgroud)