本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图,可以fork到自己仓库,有空看一看一定会有所收获,如果对你有帮助也给一个star支持一下吧!
题目链接
https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/
思路
这道题其实是考察如何计算一个数的二进制中1的数量。
我提供两种方法:
- 方法一:
朴实无华挨个计算1的数量,最多就是循环n的二进制位数,32位。
int bitCount(int n) {
int count = 0; // 计数器
while (n > 0) {
if((n & 1) == 1) count++; // 当前位是1,count++
n >>= 1 ; // n向右移位
}
return count;
}
- 方法二
这种方法,只循环n的二进制中1的个数次,比方法一高效的多
int bitCount(int n) {
int count = 0;
while (n) {
n &= (n - 1); // 清除最低位的1
count++;
}
return count;
}
以计算8的二进制1的数量为例,如图所示:
下面我就使用方法二,来做这道题目:
C++代码
class Solution {
private:
static int bitCount(int n) { // 计算n的二进制中1的数量
int count = 0;
while(n) {
n &= (n -1); // 清除最低位的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; // 如果bit中1数量相同,比较数值大小
return bitCount(a) < bitCount(b); // 否则比较bit中1数量大小
}
public:
vector<int> sortByBits(vector<int>& arr) {
sort(arr.begin(), arr.end(), cmp);
return arr;
}
};
我是程序员Carl,利用工作之余重刷leetcode,更多精彩算法文章尽在:代码随想录,关注后,回复「Java」「C++」「python」「简历模板」等等,有我整理多年的学习资料,可以加我微信,备注「简单自我介绍」+「组队刷题」,拉你进入刷题群,每天一道经典题目分析,我选的每一道题目都不是孤立的,而是由浅入深一脉相承的,如果跟住节奏每篇连续着看,定会融会贯通。
以下资料希望对你有帮助:
如果感觉题解对你有帮助,不要吝啬给一个👍吧!