为什么我的Move Zeroes函数在leetcode中是错误的答案?

时间:2019-03-15 09:50:00

标签: javascript

我正在用leetcode做Move Zeroes

我编写了一个函数来解决,但leetcode表示这是错误的答案。

有人可以看到我的代码有什么问题吗?

要求:原始数组必须突变

  

输入:[0,1,0,3,12]

     

输出:[1,3,12,0,0]

     

输入:[2,1]

     

输出:[1,2]

enter image description here

这是我的JS:

var moveZeroes = function(nums) {
    var ZeroArray=[]
    for(let i=0;i<nums.length;i++){
        if(nums[i]===0){
            ZeroArray.push(nums[i])
            nums.splice(i,1);
        }
    }
    nums.sort((a,b)=>(a-b))
    for(let j=0;j<ZeroArray.length;j++){
        nums.push(ZeroArray[j])    
    }
    return nums;
};
console.log(moveZeroes([0,1,0,3,12])); //Should return [ 1,3,12,0,0]
console.log(moveZeroes([2,1]));//Should return [1,2]

7 个答案:

答案 0 :(得分:2)

您的

nums.shift(nums[i]);

将删除(并丢弃)当时0中第nums个索引处的所有内容。如果num不是0,则推送到 different 数组可能会更容易,然后在末尾组合数组(不进行排序):

var moveZeroes = function(nums) {
  var ZeroArray = []
  var nonZeroArray = [];
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] === 0) {
      ZeroArray.push(nums[i])
    } else {
      nonZeroArray.push(nums[i]);
    }
  }
  return [...nonZeroArray, ...ZeroArray];
};
console.log(moveZeroes([0, 1, 0, 3, 12])) //Should return [ 1,3,12,0,0]

或者,如果您确实想.sort.sort

var moveZeroes = function(nums) {
  nums.sort((a, b) => (a === 0) - (b === 0));
  return nums;
};
console.log(moveZeroes([0, 1, 0, 3, 12])) //Should return [ 1,3,12,0,0]

请检查=== 0-否则,您的

.sort((a,b)=>(a-b))
如果您希望0放在末尾,则

将在0之后放置负数

如果您还需要保留非零的原始顺序,请遍历数组,拼接出0,同时跟踪要删除的数量,然后{{1 }}最后:

push

答案 1 :(得分:1)

Array.shift()从数组中删除第一个元素,您最有可能想使用Array.splice(i, 1)

答案 2 :(得分:1)

使用过滤器过滤所有非零元素,然后将剩余的数组大小附加零。

let arr = [0,1,0,3,12];
let filtered  = arr.filter(item => item !== 0);
let result = [...filtered, ...(new Array(arr.length - filtered.length).fill(0))]
console.log(result);

答案 3 :(得分:0)

使用拼接删除零并计算拼接的值。在循环中将数组中的零推入等于计数

var a=[0,1,0,3,12];
var count=0;
a.forEach(e=>{
if(e==0){
a.splice(a.indexOf(e),1)
count++
}})
for(var i=0;i<count;i++)
a.push(0)
console.log(a)

答案 4 :(得分:0)

对于下一个索引,您可以采用带有附加变量的单循环方法来交换值。

根据规范要求,这种方法可以在原位 起作用。

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
        var i, j = 0;  
        for (i = 0; i < nums.length; i++) {
            console.log(...nums);                        // look!
            if (nums[i] !== 0) {                         // check
                [nums[j], nums[i]] = [nums[i], nums[j]]; // swap items
                j++;                                     // increment target
            }        
        }
    },
    array = [0, 1, 0, 3, 12];

moveZeroes(array)
console.log(...array); // [1, 3, 12, 0, 0]

答案 5 :(得分:0)

here is code to remove zeros in c++


void pushZerosToEnd(int arr[], int n) 
    { 
        int count = 0; 
        for (int i = 0; i < n; i++) 
            if (arr[i] != 0) 
                arr[count++] = arr[i]; 
        while (count < n) 
            arr[count++] = 0; 
    } 

int main() 
{ 
    int arr[] = {1, 9, 8, 4, 0, 0, 2, 7, 0, 6, 0, 9}; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    pushZerosToEnd(arr, n); 
    cout << "Array after pushing all zeros to end of array :n"; 
    for (int i = 0; i < n; i++) 
        cout << arr[i] << " "; 
    return 0; 
} 

答案 6 :(得分:0)

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));