mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-08 02:04:31 +08:00
Add countsetbits problem with lookup table approach (#5573)
This commit is contained in:
@ -48,4 +48,32 @@ public class CountSetBits {
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/**
|
||||
* This approach takes O(1) running time to count the set bits, but requires a pre-processing.
|
||||
*
|
||||
* So, we divide our 32-bit input into 8-bit chunks, with four chunks. We have 8 bits in each chunk.
|
||||
*
|
||||
* Then the range is from 0-255 (0 to 2^7).
|
||||
* So, we may need to count set bits from 0 to 255 in individual chunks.
|
||||
*
|
||||
* @param num takes a long number
|
||||
* @return the count of set bits in the binary equivalent
|
||||
*/
|
||||
public int lookupApproach(int num) {
|
||||
int[] table = new int[256];
|
||||
table[0] = 0;
|
||||
|
||||
for (int i = 1; i < 256; i++) {
|
||||
table[i] = (i & 1) + table[i >> 1]; // i >> 1 equals to i/2
|
||||
}
|
||||
|
||||
int res = 0;
|
||||
for (int i = 0; i < 4; i++) {
|
||||
res += table[num & 0xff];
|
||||
num >>= 8;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
@ -14,4 +14,13 @@ public class CountSetBitsTest {
|
||||
assertEquals(5, csb.countSetBits(10000));
|
||||
assertEquals(5, csb.countSetBits(31));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testSetBitsLookupApproach() {
|
||||
CountSetBits csb = new CountSetBits();
|
||||
assertEquals(1L, csb.lookupApproach(16));
|
||||
assertEquals(4, csb.lookupApproach(15));
|
||||
assertEquals(5, csb.lookupApproach(10000));
|
||||
assertEquals(5, csb.lookupApproach(31));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user