Как отсортировать массив целых чисел на основе его двоичного представления в JavaScript? - PullRequest
0 голосов
/ 06 мая 2019

У меня есть задача, которая состоит в создании функции в JavaScript, которая упорядочивает массив, который получает список неупорядоченных целых чисел. Функция должна возвращать упорядоченный массив целых чисел согласно следующим критериям:

  1. Чем больше единиц в двоичном представлении целого, тем ближе к индексу 0 должен быть элемент.
  2. Если два или более числа имеют одинаковое количество единиц в двоичном представлении, десятичное число меньшее значение будет ближе к началу.

Пример:

Для записи: [1, 15, 5, 7, 3]

Возвращение должно быть: [15, 7, 3, 5, 1] ​​

Пояснение:

Десятичный = Двоичный

  • 1 = 1
  • 15 = 1111
  • 5 = 101
  • 7 = 111
  • 3 = 11

Десятичное число, двоичное представление которого содержит плюс, равно 15 (1111 в двоичном формате), поэтому оно будет идти первым в массиве (индекс = 0). Затем перейдите к 7, с тремя (111) из них в двоичном представлении.

Тогда есть 2 числа, двоичное представление которых содержит одинаковое количество единиц, эти десятичные числа 5 (101) и 3 (11), оба с 2 единицами. В этом случае он пойдет первым (ближе к индексу = 0) к 3, поскольку его десятичное представление меньше (3 <5). </p>

Решение:

Наконец-то я нашел способ решить эту задачу:

const binaryOnes = integerArr => {

  let binaryArray = integerArr.map(num => num.toString(2))

  binaryArray.sort((a, b) => {

    let regEx = /1/g
    let A = a.match(regEx).length
    let B = b.match(regEx).length

    if (A < B) return 1
    else if (A > B) return -1
    else {
      let binaryToIntegerA = parseInt(A, 2)
      let binaryToIntegerB = parseInt(B, 2)

      if (binaryToIntegerA < binaryToIntegerB) return -1
      else return 1
    }

  })

  return binaryArray.map(num => parseInt(num, 2))

}

binaryOnes([1,15,5,7,3]) // [ 15, 7, 3, 5, 1 ]

Пожалуйста, если кто-нибудь найдет лучший способ ее решить, я буду признателен.

Также некоторые отзывы на этот пост (это мой первый вопрос по StackOverflow)

Спасибо!

1 Ответ

2 голосов
/ 06 мая 2019

Вы можете преобразовать число в двоичное (строковый тип) с чем-то вроде

var binary = 134.toString(2);

Затем реализует функцию сравнения между числом с

function binaryCompare(a, b) {
    a = a.binary;
    b = b.binary;
    //...
}

После этого просто вызовите

[1,2,34,342]
.map( a => ({value:a, binary: a.toString(2))
.sort(binaryCompare)
.map( v => v.value );

Поскольку я не понимаю вашу цель, я не могу реализовать функцию сортировки.Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...