You are given an integer array arr
. Sort the integers in the array in ascending order by the number of 1
's in their binary representation and in case of two or more integers have the same number of 1
's you have to sort them in ascending order.
Return the array after sorting it.
Example 1:
Input: arr = [0,1,2,3,4,5,6,7,8] Output: [0,1,2,4,8,3,5,6,7] Explantion: [0] is the only integer with 0 bits. [1,2,4,8] all have 1 bit. [3,5,6] have 2 bits. [7] has 3 bits. The sorted array by bits is [0,1,2,4,8,3,5,6,7]
Example 2:
Input: arr = [1024,512,256,128,64,32,16,8,4,2,1] Output: [1,2,4,8,16,32,64,128,256,512,1024] Explantion: All integers have 1 bit in the binary representation, you should just sort them in ascending order.
Constraints:
1 <= arr.length <= 500
0 <= arr[i] <= 104
Companies: JPMorgan, Accenture, Goldman Sachs, Walmart Labs, Visa, Infosys, VMware, MathWorks
Related Topics:
Array, Bit Manipulation, Sorting, Counting
Similar Questions:
Hints:
- Simulate the problem. Count the number of 1's in the binary representation of each integer.
- Sort by the number of 1's ascending and by the value in case of tie.
// OJ: https://leetcode.com/problems/sort-integers-by-the-number-of-1-bits/
// Author: github.com/lzl124631x
// Time: O(NlogN)
// Space: O(N)
class Solution {
int cnt(int n) {
int c = 0;
for (; n; n >>= 1) {
if (n & 1) ++c;
}
return c;
}
public:
vector<int> sortByBits(vector<int>& arr) {
int N = arr.size();
vector<pair<int, int>> v(N);
for (int i = 0; i < N; ++i) v[i] = make_pair(cnt(arr[i]), arr[i]);
sort(v.begin(), v.end());
for (int i = 0; i < N; ++i) arr[i] = v[i].second;
return arr;
}
};
Or
// OJ: https://leetcode.com/problems/sort-integers-by-the-number-of-1-bits
// Author: github.com/lzl124631x
// Time: O(NlogN)
// Space: O(1)
class Solution {
public:
vector<int> sortByBits(vector<int>& A) {
sort(begin(A), end(A), [](int a, int b) {
int x = __builtin_popcount(a), y = __builtin_popcount(b);
return x != y ? x < y : a < b;
});
return A;
}
};