Почему моя функция Move Zeroes - неправильный ответ в leetcode? - PullRequest
0 голосов
/ 15 марта 2019

Я делал Переместить нули в leetcode.

Я пишу функцию для решения, но 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 ]

2 голосов
/ 15 марта 2019

Ваш

nums.shift(nums[i]);

удалит (и сбросит ) все, что существует в 0 -ом индексе в nums в то время. Вероятно, было бы легче передать в другой массив , если num не 0, а затем объединить массивы в конце (без сортировки):

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 s, когда вы хотите, чтобы 0 s пришли в конце независимо от того.

Если вам также необходимо сохранить исходный порядок ненулей, выполнить итерацию по массиву, склеить 0 с, отслеживая, сколько вы удаляете, а затем push их на конец:

var moveZeroes = function(nums) {
  let count = 0;
  for (let i = nums.length - 1; i >= 0; i--) {
    if (nums[i] === 0) {
      nums.splice(i, 1);
      count++;
    }
  }
  nums.push(...new Array(count).fill(0));
  return nums;
};
console.log(moveZeroes([0, 1, 0, 3, 12])) //Should return [ 1,3,12,0,0]
1 голос
/ 15 марта 2019

Используйте фильтр, чтобы отфильтровать все ненулевые элементы, а затем добавить оставшийся размер массива с нулями.

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);
1 голос
/ 15 марта 2019

Array.shift() удаляет первый элемент из массива, который вы, скорее всего, хотите использовать Array.splice(i, 1)

0 голосов
/ 15 марта 2019

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));
0 голосов
/ 15 марта 2019
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; 
} 
0 голосов
/ 15 марта 2019

Можно использовать однопетлевой подход с дополнительной переменной для следующего индекса для замены значений.

Этот подход работает in situ , как того требуют спецификации.

/**
 * @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]
0 голосов
/ 15 марта 2019

Используя сплайс, удалите ноль и посчитайте приправленные значения.В цикле нажмите нули в массиве, равные счету

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...