(位运算) 1356. 根据数字二进制下 1 的数目排序 ——【Leetcode每日一题】

这篇具有很好参考价值的文章主要介绍了(位运算) 1356. 根据数字二进制下 1 的数目排序 ——【Leetcode每日一题】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

❓ 1356. 根据数字二进制下 1 的数目排序

难度:简单

给你一个整数数组 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 < = a r r . l e n g t h < = 500 1 <= arr.length <= 500 1<=arr.length<=500
  • 0 < = a r r [ i ] < = 1 0 4 0 <= arr[i] <= 10^4 0<=arr[i]<=104

💡思路:位运算

对位运算基本操作还不太懂的小伙伴可以看我另一篇博客:一篇文章搞懂位运算!!!

法一:仿函数 + 位运算

  • 使用位运算,去除最低的那一位 1,来统计 1 的个数;
  • 然后根据仿函数的定义,重新定义比较函数 4cmp;
  • 最后使用 sort 函数重新排序,并使用我们自己定义的比较函数。

法二:数学 + 位运算

  • 由题目提示, 0 < = a r r [ i ] < = 1 0 4 0 <= arr[i] <= 10^4 0<=arr[i]<=104,所以 arr[i] 二进制1不超过 14个,占十进制中的两位;且先比较二进制中 1 的个数,所以个数可以占高位,乘以 100000;

  • 若1 的个数相同,则比较 arr[i],即最后再加上 arr[i];

  • 然后用 sort 进行排序,最后再取余,即为答案;

🍁代码:(C++、Java)

法一:仿函数 + 位运算
C++

class Solution {
private:
    static int bitCount(int num){
        int count = 0;
        while(num > 0){
            num &= (num - 1);
            count++;
        }
        return count;
    }
    static bool cmp(int a, int b){
        int bitA = bitCount(a);
        int bitB = bitCount(b);
        if(bitA == bitB) return a < b;
        return bitA < bitB;
    }
public:
    vector<int> sortByBits(vector<int>& arr) {
        sort(arr.begin(), arr.end(), cmp);
        return arr;
    }
};

法二:数学 + 位运算

C++

class Solution {
private:
    static int bitCount(int num){
        int count = 0;
        while(num > 0){
            num &= (num - 1);
            count++;
        }
        return count;
    }
public:
    vector<int> sortByBits(vector<int>& arr) {
        vector<int> map(arr.size());
        for(int i = 0; i < arr.size(); i++){
            map[i] = bitCount(arr[i]) * 100000 + arr[i];
        }
        sort(map.begin(), map.end());
        for(int i = 0; i < map.size(); i++){
            map[i] %= 100000;
        }
        return map;
    }
};

Java

class Solution {
    public int[] sortByBits(int[] arr) {
        int[] map = new int[arr.length];
        for(int i = 0; i < arr.length; i++){
            map[i] = Integer.bitCount(arr[i]) * 100000 + arr[i];
        }
        Arrays.sort(map);
        for(int i = 0; i < map.length; i++){
            map[i] %= 100000;
        }
        return map;
    }
}
🚀 运行结果:

(位运算) 1356. 根据数字二进制下 1 的数目排序 ——【Leetcode每日一题】,LeetCode,leetcode,算法,职场和发展

🕔 复杂度分析:
  • 时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn),其中 n 为数组的长度,。
  • 空间复杂度 O ( 1 ) O(1) O(1),法二为 O ( n ) O(n) O(n)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!文章来源地址https://www.toymoban.com/news/detail-524255.html

注: 如有不足,欢迎指正!

到了这里,关于(位运算) 1356. 根据数字二进制下 1 的数目排序 ——【Leetcode每日一题】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【位运算】二进制状态压缩、成对变换、lowbit运算

    二进制状态压缩,是指将一个长度为 m m m 的 bool 数组用一个 m m m 位二进制整数表示并存储的方法。 利用下列位运算操作可以实现原 bool 数组中对应下标元素的存取。 操作 运算 取出整数 n n n 在二进制表示下的第 k k k 位 (n k) 1 取出整数 n n n 在二进制表示下的第 0 0 0 ~ k −

    2024年02月08日
    浏览(30)
  • 【第36天】组合位运算训练 | 二进制思想

    本文已收录于专栏 🌸《Java入门一百例》🌸

    2024年02月01日
    浏览(29)
  • ( 位运算 ) 190. 颠倒二进制位 ——【Leetcode每日一题】

    难度:简单 颠倒给定的 32 位无符号整数的二进制位。 提示: 请注意,在某些语言(如 Java )中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是

    2024年02月03日
    浏览(29)
  • 【FPGA】Verilog:二进制并行加法器 | 超前进位 | 实现 4 位二进制并行加法器和减法器 | MSI/LSI 运算电路

    0x00 并行加法器和减法器 如果我们要对 4 位加法器和减法器进行关于二进制并行运算功能,可以通过将加法器和减法器以 N 个并行连接的方式,创建一个执行 N 位加法和减法运算的电路。 4 位二进制并行加法器 4 位二进制并行减法器

    2024年02月05日
    浏览(42)
  • 码出高效_第一章 | 有意思的二进制表示及运算

    设想有8条电路,每条电路有高电平和低电平两种状态,即就有2 8 =256种不同的信号。假设其表示区间为0~255,最大数即2 8 -1。 那么32条电路能够表示最大数为(2 32 -1)=4294967295,即所谓的32位电路信号。 正负数表示: 上面的8条电路,最左侧一条表示正负:0-整数,1-负数,不

    2024年02月06日
    浏览(26)
  • 【Golang】二进制字符串转换为数字

     在本文中,我们将探讨如何使用 Go 语言将十六进制字符串转换为二进制字符串,将不定长整型补码字符串转换为数字,以及如何将 IEEE754 标准的单精度(32位)和双精度(64位)浮点数字符串转换为数字。最后,我们将讨论如何将布尔类型的二进制字符串转换为布尔值。 这

    2024年01月16日
    浏览(33)
  • 关于二进制的原码、补码和反码,以及表示范围、常见位运算符和进制转换的理解与简述

    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17963363 出自【进步*于辰的博客】 参考笔记一,P3.13、P5.1;笔记三,P43.1/3、P44.1。 注:我暂且没有整理关于二进制、原码、补码和反码等概念的理论,本文中的阐述都基于

    2024年02月02日
    浏览(37)
  • 剑指 Offer 15. 二进制中1的个数 / LeetCode 191. 位1的个数(位运算)

    链接:剑指 Offer 15. 二进制中1的个数;LeetCode 191. 位1的个数 难度:简单 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。

    2024年02月12日
    浏览(25)
  • 【调制BFSK】二进制频移键控FSK的数字调制(Matlab代码实现)

      💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 相移键

    2024年02月08日
    浏览(29)
  • 【十进制 转 二进制】【二进制 转 十进制】10进制 VS 2进制【清华大学考研机试题】

    原题链接 本题我们先需要知道 十进制 如何转 二进制 二进制 如何转 十进制 十进制 如何转 二进制: 十进制转成二进制 例如 173 转成 二进制 就把173 短除法 除到0 然后 得到的余数, 从下往上写 二进制 转成 十进制 利用如图方法,把二进制 转成 十进制 本题是高精度,如何

    2023年04月26日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包