题目:跳转至 1356. 根据数字二进制下 1 的数目排序
给你一个整数数组arr。请你将数组中的元素按照其二进制表示中数字1的数目升序排序。
如果存在多个数字二进制中1的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
class Solution {
public:
vector<int> sortByBits(vector<int>& arr) {
}
};
思路:
找二进制中1的个数,按规则排序就行。
class Solution {
public:
int numberOneInBinary(int num){
int res=0;
while(num!=0){
res=num%2==1?res+1:res; //复杂了,因为余数只有0和1,res+=num%2就行
num=num>>1;
}
return res;
}
vector<int> sortByBits(vector<int>& arr) {
for(int i=0;i<arr.size();++i){
for(int j=i+1;j<arr.size();++j){
if((numberOneInBinary(arr[i])>numberOneInBinary(arr[j]))||
(numberOneInBinary(arr[i])==numberOneInBinary(arr[j]) && arr[i]>arr[j])){
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
}
return arr;
}
};
没想到使用sort,下面这段直接替换冒泡排序也能正常出结果。
vector<int> sortByBits(vector<int>& arr) {
sort(arr.begin(),arr.end(),[this](int x,int y){
if((numberOneInBinary(x)>numberOneInBinary(y))||
(numberOneInBinary(x)==numberOneInBinary(y) && x>y))
return false;
else
return true;
});
return arr;
}
但是按下面这样写,会报错:reference to non-static member function must be called(调用了对非静态函数的引用)
class Solution {
public:
int numberOneInBinary(int num){
int res=0;
while(num!=0){
res=num%2==1?res+1:res;
num=num>>1;
}
return res;
}
bool functionSort(int &x,int &y){
if((numberOneInBinary(x)>numberOneInBinary(y))||
(numberOneInBinary(x)==numberOneInBinary(y) && x>y))
return false;
else
return true;
}
vector<int> sortByBits(vector<int>& arr) {
sort(arr.begin(),arr.end(),functionSort);
return arr;
}
};
百度查找,普通的成员函数都有一个隐含的this指针,即函数应该为:
bool functionSort(Solution* this,int &x,int &y);
而sort()函数的第三个谓词参数只输入了两个参数,就出现了形参与实参不匹配的情况。
只把functionSort定义为static后,依然会报错:call to non-static member function without an object argument(调用了不带对象参数的非静态成员函数)
依旧百度,是类没有实例化,所以把numberOneInBinary也改为静态函数后就可以成功编译。
class Solution {
public:
static int numberOneInBinary(int num){
int res=0;
while(num!=0){
res=num%2==1?res+1:res;
num=num>>1;
}
return res;
}
static bool functionSort(int &x,int &y){
if((numberOneInBinary(x)>numberOneInBinary(y))||
(numberOneInBinary(x)==numberOneInBinary(y) && x>y))
return false;
else
return true;
}
vector<int> sortByBits(vector<int>& arr) {
sort(arr.begin(),arr.end(),functionSort);
return arr;
}
};
如果不把numberOneInBinary改为静态函数,那就实例化对象。
按下方修改也可以编译成功,不过还是直接static更简洁.
static bool functionSort(int &x,int &y){
Solution s;
if((s.numberOneInBinary(x)>s.numberOneInBinary(y))||
(s.numberOneInBinary(x)==s.numberOneInBinary(y) && x>y))
return false;
else
return true;
}
简单题使人快乐。