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

时间:2015-10-26 12:14:49

标签: javascript arrays algorithm

我正在尝试在JS中完成leetcode.com question。我是一般的算法新手,在接受我的第一次提交时遇到了一些麻烦。

该问题指定以下内容:

给定一个数组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;
};

代码示例顶部的注释在其文本编辑器中提供,并让我相信我不应该提供任何return语句。虽然他们网站上的验证器似乎根本不想接受,所以我开始返回null ...

当我在处理输入后将nums记录到控制台时,我看到了所需的结果nums = [1, 3, 12, 0, 0]。无论我的答案一直被拒绝。我很想知道我在这里做错了什么,所以我可以解决它。

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

16 个答案:

答案 0 :(得分:3)

问题与return语句无关,问题是你的算法错了。

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

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

你需要向负方向循环。从最后开始,然后开始。

for (i = nums.length-1; i>=0; i--) {

答案 1 :(得分:2)

正如大家已经说过的那样:当它说不返回任何东西时,根本就不要写回报声明。

但是,您的代码存在问题。使用测试用例[0,0,1]。 如果从第一个元素开始,则将其移动到数组的后面,[0,1,0]。现在你的循环索引正在查看第二个元素,即1.你完全错过了第二个元素。

答案 2 :(得分:0)

javascript

中没有 从技术上讲,

null并非一无是处。试试这个:typeof null。你得到"object",这几乎就是其中之一。如果你运行的函数确实没有返回任何内容:

(function(){})();

您将在控制台中看到undefined。因此,return undefinedreturn或任何内容都不会被视为正常。

排序替代解决方案

我只是想提出更实际的解决方案,给你另一种观点。既然是javascript,你可以使用sort函数。您必须创建自己的回调来比较元素:

array.sort(function(a, b) { ... comparison here ... });

现在在您的具体案例中,我们想要什么?我们说,

  

a小于b 当且仅当 a为零并且b 为零时

所以我们的回调:

function(a, b) {
    if(a==0 && b!=0)
        return 1;
    else if(b==0 && a!=0)
        return -1;
    else 
        return 0;
}

像这样使用:

var array = [2,6,0,666,-6,142,0,1,-10];
array.sort(function(a, b) {
        if(a==0 && b!=0)
            return 1;
        else if(b==0 && a!=0)
            return -1;
        else 
            return 0;
    });

这是我们在实际编写程序时通常所做的事情,因为它更容易理解(一旦你习惯了),并且在大多数时候都更短。

答案 3 :(得分:0)

按升序对数组进行排序,而不是从头到尾循环查找零。 当你找到它时,拼接数组将删除当前索引并推零(

var moveZeroes = function(nums) {
  nums.sort((a,b) => {return a-b});
   for(let index = nums.length - 1; index >= 0 ; index--){
    if(nums[index] === 0){
      nums.splice(index, 1);
      nums.push(0);
    }
   }
};

答案 4 :(得分:0)

function pushZerosToEnd(arr){

.animateNextImage div{
  width: 33.3333%;
  float:left;
  height: 100%;
  background-repeat: no-repeat;
  background-size: cover;
  background-position: -100% 0%;
  transition: background-position 0.5s ease;
}
.animateNextImage.active div:nth-child(1){
  transition-delay: 0.4s;
  background-position: 0% 0%;
}
.animateNextImage.active div:nth-child(2){
  transition-delay: 0.2s;
  background-position: 50% 0%;
}
.animateNextImage.active div:nth-child(3){
  background-position: 100% 0%;
}

console.log(pushZerosToEnd([0,1,2,0,3,0,5,6]));

答案 5 :(得分:0)

// javascript //单数组操作:

var a = [1, 2, 0, 0, 3, 0, 3, 0, 2, 0, 0, 0, 5, 0];
function moveZero(b) {
    for (var i = b.length - 1; i >= 0; i--) {
        if (b[i] === 0) {
            b.splice(i, 1);
            b.push(0);
        }
    }
    return b;
}
console.log(moveZero(a));

//多数组操作=>另一种方法 //算法:将一个数组中的所有非零元素推入另一个数组中的所有零 //一旦循环终止就连接它们

var a = [1, 2, 0, 0, 3, 0, 3, 0, 2, 0, 0, 0, 5, 0];
var b = [];
var c = [];

function moveZero(data) {

    for (var i = 0; i < data.length - 1; i++) {
        if (data[i] !== 0) {
            b.push(data[i]);
        } else {
            c.push(0)
        }
    }
    if (c.length > 0) {
        b = b.concat(c);
    }
    return b;
}
console.log(moveZero(a));

答案 6 :(得分:0)

这是该问题的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;    
    };

答案 7 :(得分:0)

也可以通过这种方式完成:

var moveZeroes = function(nums) {
    var len = nums.length, i = nums.indexOf(0);
    while(~i && i < --len){
        nums.splice(i, 1);
        nums.push(0);
        i = nums.indexOf(0);
    }
};

答案 8 :(得分:0)

尝试这个

 function order(array){
  count = 0;
  for(var i=0;i<array.length;i++){
    if(array[i] !== 0){
      //non zero element count
      array[count] = array[i]

      count++;


    }
  }

  while(count<array.length){

    array[count] = 0

    count++
  }

  return array
}
var array = [1, 9, 8, 4, 0, 0, 2, 7, 0, 6, 0]
console.log(order(array))

答案 9 :(得分:0)

尝试使用ES6功能的这种方法

let filteredArr = nums.filter((elem) => {
    return elem !== 0;
}) // Create a new Array with all non zero elements

let countOfZero = nums.length - filteredArr.length // Get Count of Zero elements

let newArr = [...filteredArr,...Array(countOfZero).fill(0)] // Create a new array containig only zero equivalent to count of zero elements and filtered non zero elements Array 

return nums.splice(0,nums.length,...newArr) // Use splice to alter original array and then add new Array using spread operator

答案 10 :(得分:0)

这是简单的

function check(arr){
      var i=0;
      var j=arr.length-1;
      while(j>i+1){
        if(arr[i]!==0){
          i++;
        }
        if(arr[j]===0){
          j--;
        }
        if(arr[i]===0){
          arr[i]=arr[j];
          arr[j]=0;
        }
      }
     return arr;
    }

答案 11 :(得分:0)

Splice()用于删除元素(在这种情况下为零)。然后,将零推到数组的末尾。

 var moveZeroes = function (nums) {
  var length = nums.length;
  while (length-- > -1) {
    if (nums[length] == 0) nums.splice(length, 1).push(0);
  }
  return nums;
};

答案 12 :(得分:0)

这是一个非常简单的解决方案:

时间复杂度 O(n)

var moveZeroes = function(nums) {
    var i = nums.length;
    while (i > -1) {
        let current = nums[i];
        if(nums[i] === 0) {
            nums.splice(i,1)
            nums.push(current)
        } 
       i--; 
    }
    return nums;
};
let arr = [0,1,0,3,12]
console.log(moveZeroes(arr))

答案 13 :(得分:-1)

如果您必须提供退货声明,但不允许退货,您可以写

return;

答案 14 :(得分:-1)

使用JAVA将零移动到数组结尾

import java.util.Arrays;

公共类MoveZerosToEndWithJava {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int[] A = { 6, 8, 0, 2, 3, 0, 4, 1 };

    moving(A);
}

public static void moving(int[] a) {

    int countZero = 0;
    System.out.println(Arrays.toString(a));
    System.out.print("[");
    for (int i = 0; i < a.length; i++) {
        if (a[i] == 0) {
            countZero++;
        } else {
            if (i + 1 == a.length && countZero == 0) {
                System.out.print(a[i] + "]");
            } else {
                System.out.print(a[i] + ", ");
            }
        }
    }
    for (int i = 0; i < countZero; i++) {
        if (i + 1 == countZero) {
            System.out.print("0");
        } else
            System.out.print("0, ");
    }
    if (countZero > 0) {
        System.out.println("]");
    }
}

}

答案 15 :(得分:-2)

试试这个:

var moveZeroes = function(nums) {
    var i;

    for (i = 0; i < nums.length; i++) {
        if(nums[i] === 0) {
            nums = nums.splice(i, 1);
            nums.push(0);
        }
    }
    return;
};