鱼C论坛

 找回密码
 立即注册
查看: 1360|回复: 8

[技术交流] C++刷leetcode(1356. 根据数字二进制下 1 的数目排序)【位运算】

[复制链接]
发表于 2020-5-16 17:21:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目描述:
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。

如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。

请你返回排序后的数组。

 

示例 1:

输入:arr = [0,1,2,3,4,5,6,7,8]
输出:[0,1,2,4,8,3,5,6,7]
解释:[0] 是唯一一个有 0 个 1 的数。
[1,2,4,8] 都有 1 个 1 。
[3,5,6] 有 2 个 1 。
[7] 有 3 个 1 。
按照 1 的个数排序得到的结果数组为 [0,1,2,4,8,3,5,6,7]
示例 2:

输入:arr = [1024,512,256,128,64,32,16,8,4,2,1]
输出:[1,2,4,8,16,32,64,128,256,512,1024]
解释:数组中所有整数二进制下都只有 1 个 1 ,所以你需要按照数值大小将它们排序。
示例 3:

输入:arr = [10000,10000]
输出:[10000,10000]
示例 4:

输入:arr = [2,3,5,7,11,13,17,19]
输出:[2,3,5,17,7,11,13,19]
示例 5:

输入:arr = [10,100,1000,10000]
输出:[10,100,10000,1000]
 

提示:

1 <= arr.length <= 500
0 <= arr[i] <= 10^4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

int com(int input){
    int res = 0;
    while(input){
        res += input&1;
        input >>= 1;
    }
    return res;
}
bool cmp(int a, int b){
    int num1 = com(a), num2 = com(b);
    return num1 == num2 ? a < b : num1 < num2;
} 
class Solution {
public:
    vector<int> sortByBits(vector<int>& arr) {
        sort(arr.begin(), arr.end(), cmp);
        return arr;
    }
};


注意事项:
1.sort中的cmp函数还是单独写比较好。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-16 17:24:19 | 显示全部楼层
使用[&](int&a, int&b){return ;}溢出了,还没找到原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-16 17:45:21 | 显示全部楼层
糖逗 发表于 2020-5-16 17:24
使用[&](int&a, int&b){return ;}溢出了,还没找到原因


没引用,没出错
const static bool _=[](){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    return false;
}();


int BitCount(int n){
    int result=0;
    while(n){
        result+=n&1;
        n>>=1;
    }
    return result;
}


class Solution {
public:
    vector<int> sortByBits(vector<int>& arr) {
        sort(arr.begin(),arr.end(),[](int a,int b){
            int c=BitCount(a),d=BitCount(b);
            return c==d?a<b:c<d;
        });
        return arr;
    }
};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-16 18:47:14 | 显示全部楼层


这个写法我看懂了,但是我这个写法不知道为啥溢出了
class Solution {
public:
    int comput(int input){
        int res = 0;
        while(input){
            res += input&1;
            input >>= 1;
        }
        return res;
    }
    vector<int> sortByBits(vector<int>& arr) {
        vector<int> res(arr);
        vector<int> store;
        for(int i = 0; i < arr.size(); i++){
            store.push_back(comput(arr[i]));
        }
        // for(auto cha : res)cout << cha << " ";
        // cout << endl;
        // for(auto cha : store) cout << cha << " ";
        sort(res.begin(), res.end(), [&](int& a, int& b){return store[a] == store[b]? arr[a] < arr[b] : store[a] < store[b];});
        return res;
    }
};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-16 19:00:39 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-5-16 19:03 编辑
糖逗 发表于 2020-5-16 18:47
这个写法我看懂了,但是我这个写法不知道为啥溢出了


我没记错的话,sort 给比较函数传进来的不是 index,而是值,所以我就不能理解你的
store[a] store[b] arr[a] arr[b]
了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-16 20:11:33 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-16 19:00
我没记错的话,sort 给比较函数传进来的不是 index,而是值,所以我就不能理解你的  了。

https://fishc.com.cn/thread-166741-1-1.html


我之前做另一个题的时候,看到了这种写法,当时觉得挺方便的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-16 20:13:54 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-16 19:00
我没记错的话,sort 给比较函数传进来的不是 index,而是值,所以我就不能理解你的  了。

还有这道题1337. 方阵中战斗力最弱的 K 行

我按照上一个帖子中的[&]这种写法还可以通过,真的迷惑
class Solution {
public:
    vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
        vector<int> res;
        vector<int> store;
        for(int i = 0; i < mat.size(); i++){
            int temp = 0;
            store.push_back(i);
            for(int j = 0; j < mat[0].size(); j++){
                if(mat[i][j] == 1) temp ++;
            }
            res.push_back(temp);
        }
        //for(auto cha : res) cout << cha << " ";
        sort(store.begin(), store.end(), [&](int&a, int&b){return res[a] != res[b] ?res[a] < res[b]: a<b;});
        vector<int> result (store.begin(), store.begin() + k);
        return result;
    }
};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-16 20:15:55 | 显示全部楼层
糖逗 发表于 2020-5-16 20:13
还有这道题1337. 方阵中战斗力最弱的 K 行

我按照上一个帖子中的[&]这种写法还可以通过,真的迷惑{:10 ...

玄学C++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-16 20:22:52 | 显示全部楼层

I don‘t konw 先不想了,也许过段时间能懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-14 01:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表