本题是自定义排序 + 模拟数组操作,可按以下步骤处理:
1 的个数(含符号位),记为 popcount32(x);排序键为 (popcount32(x), x) 升序。Python 可用 bin(x & 0xFFFFFFFF).count('1'),Java 用 Integer.bitCount,C++ 对 unsigned 做 __builtin_popcount。data 排序。i, j:
merged = arr[i] | arr[j](i == j 时即 arr[i] | arr[i]);i == j 时 pop(i) 一次;否则先删较大下标再删较小下标,避免下标错位;给定两个 int 数组,数据数组(一维)和操作数组(二维):
输入
[3,2,1],[[0,1]]
输出
[3,3]
说明
排序后内容为 [1,2,3],对 1 和 2 进行或操作得到 3,删除并插入重新排序后得到 [3,3]。
输入
[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]。
输入
[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]。