Skip to content

Commit 0079cc6

Browse files
committed
Solution to "Sort Integers by The Number of 1 Bits" problem
1 parent b9825e2 commit 0079cc6

2 files changed

Lines changed: 104 additions & 0 deletions

File tree

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.github.dkoval.leetcode.challenge;
2+
3+
import java.util.Arrays;
4+
5+
/**
6+
* <a href="https://leetcode.com/problems/sort-integers-by-the-number-of-1-bits/">Sort Integers by The Number of 1 Bits</a>
7+
* <p>
8+
* You are given an integer array arr. Sort the integers in the array in ascending order by the number of 1's
9+
* 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.
10+
* <p>
11+
* Return the array after sorting it.
12+
* <p>
13+
* Constraints:
14+
* <ul>
15+
* <li>1 <= arr.length <= 500</li>
16+
* <li>0 <= arr[i] <= 10^4</li>
17+
* </ul>
18+
*/
19+
public interface SortIntegersByNumberOf1Bits {
20+
21+
int[] sortByBits(int[] arr);
22+
23+
class SortIntegersByNumberOf1BitsRev1 implements SortIntegersByNumberOf1Bits {
24+
25+
@Override
26+
public int[] sortByBits(int[] arr) {
27+
final var nums = fromPrimitiveArray(arr);
28+
Arrays.sort(nums, (x, y) -> {
29+
final var count1 = countBits(x);
30+
final var count2 = countBits(y);
31+
return (count1 != count2) ? Integer.compare(count1, count2) : Integer.compare(x, y);
32+
});
33+
return toPrimitiveArray(nums);
34+
}
35+
36+
private Integer[] fromPrimitiveArray(int[] arr) {
37+
return Arrays.stream(arr).boxed().toArray(Integer[]::new);
38+
}
39+
40+
private int[] toPrimitiveArray(Integer[] arr) {
41+
return Arrays.stream(arr).mapToInt(Integer::intValue).toArray();
42+
}
43+
44+
private int countBits(int x) {
45+
var count = 0;
46+
while (x > 0) {
47+
count += x & 1;
48+
x >>= 1;
49+
}
50+
return count;
51+
}
52+
}
53+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.github.dkoval.leetcode.challenge
2+
3+
import com.github.dkoval.leetcode.challenge.SortIntegersByNumberOf1Bits.SortIntegersByNumberOf1BitsRev1
4+
import org.junit.jupiter.api.Assertions.assertArrayEquals
5+
import org.junit.jupiter.api.Nested
6+
import org.junit.jupiter.api.extension.ExtensionContext
7+
import org.junit.jupiter.params.ParameterizedTest
8+
import org.junit.jupiter.params.provider.Arguments
9+
import org.junit.jupiter.params.provider.Arguments.arguments
10+
import org.junit.jupiter.params.provider.ArgumentsProvider
11+
import org.junit.jupiter.params.provider.ArgumentsSource
12+
import org.junit.jupiter.params.support.ParameterDeclarations
13+
import java.util.stream.Stream
14+
15+
internal class SortIntegersByNumberOf1BitsTest {
16+
17+
class InputArgumentsProvider : ArgumentsProvider {
18+
19+
override fun provideArguments(
20+
parameters: ParameterDeclarations,
21+
context: ExtensionContext
22+
): Stream<out Arguments> = Stream.of(
23+
arguments(
24+
intArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8),
25+
intArrayOf(0, 1, 2, 4, 8, 3, 5, 6, 7)
26+
),
27+
arguments(
28+
intArrayOf(1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1),
29+
intArrayOf(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024)
30+
)
31+
)
32+
}
33+
34+
@Nested
35+
inner class SortIntegersByNumberOf1BitsIterTest {
36+
37+
@ParameterizedTest
38+
@ArgumentsSource(InputArgumentsProvider::class)
39+
fun `should sort the array by the number of 1 bits in their binary representation`(
40+
arr: IntArray,
41+
expected: IntArray
42+
) {
43+
SortIntegersByNumberOf1BitsRev1().test(arr, expected)
44+
}
45+
}
46+
}
47+
48+
private fun SortIntegersByNumberOf1Bits.test(arr: IntArray, expected: IntArray) {
49+
val actual = sortByBits(arr)
50+
assertArrayEquals(expected, actual)
51+
}

0 commit comments

Comments
 (0)