【发布时间】:2020-08-24 09:04:37
【问题描述】:
给定一个整数数组 arr。您必须按二进制表示中 1 的数量对数组中的整数进行升序排序,如果两个或多个整数具有相同数量的 1,则必须按升序对它们进行排序。
返回排序后的数组。
输入:arr = [0,1,2,3,4,5,6,7,8]
输出:[0,1, 2,4,8,3,5,6,7]
解释:[0]是唯一的0位整数。 [1,2,4,8] 都有 1 少量。 [3,5,6] 有 2 位。 [7] 有 3 位。按位排序的数组是 [0,1,2,4,8,3,5,6,7]
输入:arr = [1024,512,256,128,64,32,16,8,4,2,1]
输出: [1,2,4,8,16,32,64,128,256,512,1024]
解释:所有整数都有1 二进制表示中的位,您应该只对它们进行排序 升序。
因此,我在这里使用了 Brian Kernigham 的算法来计算数组中每个整数中 1 的位数。这是我迄今为止编写的代码:-
class Solution {
public:
vector<int> sortByBits(vector<int>& arr) {
//firstly sort the input array
sort(arr.begin(), arr.end());
vector<int> count;
//Using Brian Kernigham's Algorithm
for(int i =0; i<arr.size(); i++){
while(arr[i]){
arr[i] = arr[i] & (arr[i] -1);
count[i] ++;
}
}
}
};
但是,我不知道如何组合 count[] 数组和输入数组 arr[] 来获得输出。我曾想过使用 C++ 的 map() STL,但由于函数需要返回 vector<int>,所以我放弃了它。
有人可以提供进一步的解决方案吗?另外,请不要分享任何使用预定义函数builtin_popcount()的代码
【问题讨论】:
-
"请不要分享任何使用预定义函数 builtin_popcount() 的代码" 为什么不呢?这就是你已经拥有的功能,给定一些使用内置函数进行排序的代码,应该可以用你的计数函数替换它
-
std::bitset::count()也算预定义吗? -
顺便说一句,我是 brian kernighaN。
-
为什么不创建一个比较两个整数值的比较函数,如果第一个比第二个“更小”(位数少)则返回 true,然后将其传递给
std::sort用作比较函数? -
@Someprogrammerdude 因为这样计算位的函数必须被调用超过必要的次数。好吧,这是一种权衡,我选择了一个不同的答案
标签: c++ arrays bit-manipulation bit