смещение нулей в конец массива и сохранение ненулевых элементов без изменения порядка - PullRequest
1 голос
/ 23 сентября 2019

У меня есть массив смешанных чисел, из которого мне нужно сдвинуть нулевой номер до конца, не меняя порядок ненулевых чисел в простом JAVASCRIPT.

Примечание: это нужно обрабатывать без создания нового массива.

Пример:

inp_arr = [12,5,0,78,94,0,34,0,67];

ожидаемый результат:

[12,5,78,94,34,67,0,0,0];

способ, которым я реализовал:

function sortArray(inputArray){
    let non_zeroArray = []
    let zero_Array = [];
    inputArray.map(item => {
        item != 0 ? non_zeroArray.push(item) : zero_Array.push(item)
    });
    return non_zeroArray.concat(zero_Array)
}

console.log(
  sortArray([32, 0, 12, 78, 0, 56, 0, 87, 0])
)

Ответы [ 5 ]

1 голос
/ 24 сентября 2019

Ваше решение в любом случае достаточно хорошо, поскольку оно имеет линейную сложность O(n).Таким образом, вы не сортируете элементы, а фильтруете исходный массив, а затем нажимаете нули в конце.

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

Если по какой-то причине выЧтобы переместить другие значения, вы можете использовать второй аргумент метода.

Кроме того, вы можете отложить отправку нулей в массив во время итерации.Просто подсчитать их и составить массив в конце.

const moveValueAtEnd = (arr, value) => {
  let counter = 0;
  return arr.filter((val) => {
    const match = val === value;
    enter code here
     // in js, boolean is casted to 0 or 1 when using arithmetic operation
     counter += match; 

     return !match;
  }).concat(Array(counter).fill(value))

}
0 голосов
/ 24 сентября 2019

Вы можете использовать array#sort для перемещения 0 в массиве до последнего.

let arr = [12,5,0,78,94,0,34,0,67];
arr.sort((a,b) => (a == 0) - (b == 0));
console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 24 сентября 2019

Ну, вы можете просто использовать Array#sort() метод с условием проверки 0 в обратном вызове, он будет напрямую обновлять массив current:

inp_arr.sort((a, b) => {
  if (a == 0) {
    return 1;
  } else if (b == 0) {
    return -1;
  }
});

Демонстрация:

inp_arr = [12, 5, 0, 78, 94, 0, 34, 0, 67];

inp_arr.sort((a, b) => {
  if (a == 0) {
    return 1;
  } else if (b == 0) {
    return -1;
  }
});

console.log(inp_arr);
0 голосов
/ 24 сентября 2019

Вам нужно всего две for петли.Внешний цикл проходит через массив от первого элемента до предыдущего и ищет нули.Если он находит один второй цикл, сдвигает оставшиеся элементы на один влево, ставит ноль в конце и уменьшает оставшиеся элементы на единицу.

function collapse_zeros (a)
{
  let l = a.length;
  for (i = 0; i < l - 1; i++)
    if (a[i] == 0)
    {
      for (j = i; j < l - 1; j++)
        a[j] = a[j+1];
      a[l-1] = 0;
      l--;
    }
  return a;
}

console.log (collapse_zeros ([32, 0, 12, 78, 0, 56, 0, 87, 0]));
0 голосов
/ 24 сентября 2019

Передайте функцию сравнения в array :: sort.Поменяйте местами только пары, если они не равны, а одна равна 0, в противном случае сохраните существующий порядок.

const data = [12,5,0,78,94,0,34,0,67];

const sortedData = data.sort((a, b) => {
  if (a !== b) {
    if (a === 0) return 1; // shift a back a place
    if (b === 0) return -1; // shift a forward a place
  }
  return 0; // keep in place
});

console.log(JSON.stringify(sortedData));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...