LeetCode#1356根据数字二进制下 1 的数目排序
题目链接
题目意思很简单,把按照每一个数的二进制1数量进行排序,如果1的数量相同,则按照数的大小进行排序,我第一个想到的就是直接使用sort配合自己写的排序函数,思路很简单。这里简单复习学习一下sort排序时自定义比较函数的规则:
1
| 比较函数,以形参列表中的两个元素作为参数,并返回可转换为bool类型的值。 返回的值表示作为第一个参数传递的元素是否被认为是在它定义的特定严格弱顺序中的第二个参数之前。
|
通俗来说,比较函数应该是bool型的,如果返回值为true,则这两个数不交换,反之交换。
搞明白这点之后,这道题就比较容易了,先附我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public: static bool cmp(int a,int b) { int flag1=0,flag2=0; int tempa=a,tempb=b; while(a!=0) { if(a%2) flag1++; a/=2; } while(b!=0) { if(b%2) flag2++; b/=2; } if(flag1==flag2) return tempa<tempb; return flag1<flag2; } vector<int> sortByBits(vector<int>& arr) { sort(arr.begin(),arr.end(),cmp); return arr; } };
|
这次附题解代码是因为他用了c++11的标准,直接使用了lambda表达式,记录一下用法(c++越来越像python了…):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: int get(int x){ int res = 0; while (x) { res += (x % 2); x /= 2; } return res; } vector<int> sortByBits(vector<int>& arr) { vector<int> bit(10001, 0); for (auto x: arr) { bit[x] = get(x); } sort(arr.begin(),arr.end(),[&](int x,int y){ if (bit[x] < bit[y]) { return true; } if (bit[x] > bit[y]) { return false; } return x < y; }); return arr; } };
|