LeetCode每日一题--1356. 根据数字二进制下 1 的数目排序(排序)

题目:跳转至 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;
    }

简单题使人快乐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值