P14402.数组按二进制比特排序(200分)
题目内容
给定两个 int 数组,数据数组(一维)和操作数组(二维):
- 数据数组:存放待操作的整数;
- 操作数组:每个元素为包含两个 int 的一维数组,这两个 int 数字指定当前需要操作的数据数组下标(从 0 开始)。
操作流程
- 对数据数组排序:按整数二进制表示中 1 的个数升序排列(符号位中的 1 也计入);1 的个数相同时,按数值升序排列。
- 依次对操作数组中的每个元素执行以下操作:
2.1 读取两个下标,取当前数据数组中对应位置的元素,计算它们的二进制按位或,将结果追加到数据数组末尾,并删除原来的两个元素(元素下标允许相同,此时仅删除一个元素)。
2.2 对更新后的数据数组按步骤 1 的规则重新排序。
- 输出最终排序后的数据数组。
注意
- 数据数组的长度范围为 [0,100],元素值范围为 [−231,231−1]。
- 操作数组的长度范围为 [0,10],每个元素中数组长度保证为 2,数值作为当前数据数组下标保证不会越界。
- 即使操作数组为空,最后输出的数据数组也需要按照描述的排序方式输出有序数据数组。
样例1
输入
[3,2,1],[[0,1]]
输出
[3,3]
说明
排序后内容为 [1,2,3],对 1 和 2 进行或操作得到 3,删除并插入重新排序后得到 [3,3]。
样例2
输入
[1024,512,256,128,64,32,16,8,4,2,1,0,-1],[[0,1],[0,1],[0,1],[1,2]]
输出
[16,128,256,512,1024,3,12,96,-1]
说明
排序后内容为 [0,1,2,4,8,16,32,64,128,256,512,1024,−1],经过第一次操作结果为 [0,1,2,4,8,16,32,64,128,256,512,1024,−1],第二次操作结果为 [4,8,16,32,64,128,256,512,1024,3,1024,−1],第三次操作结果为 [16,32,64,128,256,512,1024,3,12,−1],最后一次操作结果为 [16,128,256,512,1024,3,12,96,−1]。
样例3
输入
[2147483647,-2147483648,-1,0],[[1,2],[2,2]]
输出
[0,-1,-1]
说明
原始数组按照二进制表示为[01111111111111111111111111111111,10000000000000000000000000000000,11111111111111111111111111111111,00000000000000000000000000000000],按照 1 的数量进行排序后数组顺序为: [0,−2147483648,2147483647,−1]。
接下来对 index 为 1 和 2 的元素即 −2147483648、2147483647 进行或操作获得结果 −1,将 [−2147483648,2147483647] 从数组中删除并插入 −1 后得到 [0,−1,−1]。
最后对 index 为 2 的元素自身进行或操作不会改变数据。最终返回 [0,−1,−1]。