如何基于JavaScript中的二进制表示对整数数组进行排序?

时间:2019-05-06 14:15:22

标签: javascript arrays binary integer

我有一个任务,包括在JavaScript中创建一个函数,该函数对接收无序整数列表的数组进行排序。该函数必须根据以下条件返回有序整数数组:

  1. 整数的二进制表示中的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。在这种情况下,它将以3开头(接近索引= 0),因为它的十进制表示形式较小(3 <5)。

解决方案:

最后,我找到了解决此任务的方法:

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 个答案:

答案 0 :(得分:2)

您可以将数字转换为二进制(字符串类型)

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

由于我不了解您的目标,因此无法实现排序功能。 希望对您有帮助