LeetCode-1356-Sort-Integers-By-Number-Of-1-Bits

🧠 Summary of Thoughts

  1. Precompute bit counts using a HashMap
  2. Convert int[] to Integer[], since Arrays.sort() with a custom Comparator does NOT work on primitive int[]
  3. Sort using a custom Comparator
  4. Copy back to int[]

Learned:

  1. Custom sort:
    Arrays.sort(nums, new Comparator<Integer>() { ... });

  2. Lambda Structure:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (a, b) -> {
    //...
    }

    // it is equvalent to:


    public int compare(Integer a, Integer b) {
    //...
    }
    • Example:
      1. tradition method:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        Arrays.sort(nums, new Comparator<Integer>() {

        @Override
        public int compare(Integer a, Integer b) {

        int bitA = arrays.get(a);
        int bitB = arrays.get(b);

        if (bitA != bitB) {
        return bitA - bitB;
        }

        return a - b;
        }
        });
      2. Lambda:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        Arrays.sort(nums, (a, b) -> {
        int bitA = arrays.get(a);
        int bitB = arrays.get(b);

        if (bitA != bitB) {
        return bitA - bitB;
        }

        return a - b;
        });

❗ Easily wrong point

  • We need to copy each arr element into a temporary variable so as to protect the original values!!!

✅ Code(Java)

1.

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
30
31
32
33
34
35
36
37
38
39
class Solution {
public int[] sortByBits(int[] arr) {
// x = 2^0 + 2^1 + 2^2 + 2^3 + ... + 2^n
Map<Integer, Integer> arrays = new HashMap<>();
for (int i = 0; i < arr.length; i++) {
int num = arr[i];
int temp = num;
int count = 0;
while (temp != 0) {
int module = temp % 2;
if (module == 1) {
count++;
}
temp /= 2;
}
arrays.put(num, count);
}
// boxing
Integer[] nums = new Integer[arr.length];
for (int i = 0; i < arr.length; i++) {
nums[i] = arr[i];
}
Arrays.sort(nums, new Comparator<Integer>() {
@Override
public int compare (Integer a, Integer b) {
int bitA = arrays.get(a);
int bitB = arrays.get(b);
if (bitA != bitB) {
return bitA - bitB;
}
return a - b;
}
});
for (int i = 0; i < arr.length; i++) {
arr[i] = nums[i];
}
return arr;
}
}
  1. optimal solution
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
import java.util.*;

class Solution {
public int[] sortByBits(int[] arr) {

Integer[] nums = new Integer[arr.length];
for (int i = 0; i < arr.length; i++) {
nums[i] = arr[i];
}

Arrays.sort(nums, (a, b) -> {
int bitA = Integer.bitCount(a);
int bitB = Integer.bitCount(b);

if (bitA != bitB) {
return bitA - bitB;
}
return a - b;
});

for (int i = 0; i < arr.length; i++) {
arr[i] = nums[i];
}

return arr;
}
}

LeetCode-1356-Sort-Integers-By-Number-Of-1-Bits
https://powersixxx.github.io/leetcode-blog/2026/02/26/LeetCode-1356-Sort-Integers-By-Number-Of-1-Bits/
作者
Baowen Liu
发布于
2026年2月26日
许可协议