Skip to content

Commit 3fc272d

Browse files
feat: add Reverse Bits solution
- Bit manipulation algorithm implementation - Multiple approaches: String Conversion, Recursive, Lookup Table - O(32) time, O(1) space complexity - Comprehensive solutions and optimizations
1 parent 32e9b58 commit 3fc272d

1 file changed

Lines changed: 151 additions & 0 deletions

File tree

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
/**
2+
* Time Complexity: O(32) - Constant time
3+
* Space Complexity: O(1) - No extra space
4+
*/
5+
public class Solution {
6+
// you need treat n as an unsigned value
7+
public int reverseBits(int n) {
8+
int result = 0;
9+
10+
for (int i = 0; i < 32; i++) {
11+
result = (result << 1) | (n & 1);
12+
n >>>= 1; // Use unsigned right shift
13+
}
14+
15+
return result;
16+
}
17+
}
18+
19+
// Alternative approach using string conversion
20+
class SolutionStringConversion {
21+
public int reverseBits(int n) {
22+
String binary = Integer.toBinaryString(n);
23+
24+
// Pad with leading zeros to make it 32 bits
25+
while (binary.length() < 32) {
26+
binary = "0" + binary;
27+
}
28+
29+
// Reverse the string
30+
StringBuilder reversed = new StringBuilder(binary).reverse();
31+
32+
// Convert back to integer
33+
return Integer.parseUnsignedInt(reversed.toString(), 2);
34+
}
35+
}
36+
37+
// Alternative approach using iterative
38+
class SolutionIterative {
39+
public int reverseBits(int n) {
40+
int result = 0;
41+
42+
for (int i = 0; i < 32; i++) {
43+
result = (result << 1) | (n & 1);
44+
n >>>= 1;
45+
}
46+
47+
return result;
48+
}
49+
}
50+
51+
// Alternative approach using while loop
52+
class SolutionWhileLoop {
53+
public int reverseBits(int n) {
54+
int result = 0;
55+
int i = 0;
56+
57+
while (i < 32) {
58+
result = (result << 1) | (n & 1);
59+
n >>>= 1;
60+
i++;
61+
}
62+
63+
return result;
64+
}
65+
}
66+
67+
// Alternative approach using enhanced for loop
68+
class SolutionEnhancedForLoop {
69+
public int reverseBits(int n) {
70+
int result = 0;
71+
72+
for (int i = 0; i < 32; i++) {
73+
result = (result << 1) | (n & 1);
74+
n >>>= 1;
75+
}
76+
77+
return result;
78+
}
79+
}
80+
81+
// Alternative approach using recursive
82+
class SolutionRecursive {
83+
public int reverseBits(int n) {
84+
return reverseBitsHelper(n, 0, 0);
85+
}
86+
87+
private int reverseBitsHelper(int n, int result, int i) {
88+
if (i >= 32) {
89+
return result;
90+
}
91+
92+
return reverseBitsHelper(n >>> 1, (result << 1) | (n & 1), i + 1);
93+
}
94+
}
95+
96+
// Alternative approach using lookup table
97+
class SolutionLookupTable {
98+
private static final int[] REVERSE_TABLE = {
99+
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
100+
0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
101+
0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
102+
0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
103+
0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
104+
0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
105+
0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
106+
0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
107+
0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
108+
0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
109+
0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
110+
0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
111+
0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
112+
0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
113+
0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
114+
0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
115+
0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
116+
0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
117+
0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
118+
0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
119+
0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
120+
0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
121+
0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
122+
0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
123+
0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
124+
0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
125+
0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
126+
0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
127+
0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
128+
0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
129+
0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
130+
0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
131+
};
132+
133+
public int reverseBits(int n) {
134+
return (REVERSE_TABLE[n & 0xFF] << 24) |
135+
(REVERSE_TABLE[(n >>> 8) & 0xFF] << 16) |
136+
(REVERSE_TABLE[(n >>> 16) & 0xFF] << 8) |
137+
(REVERSE_TABLE[(n >>> 24) & 0xFF]);
138+
}
139+
}
140+
141+
// More concise version
142+
class SolutionConcise {
143+
public int reverseBits(int n) {
144+
int result = 0;
145+
for (int i = 0; i < 32; i++) {
146+
result = (result << 1) | (n & 1);
147+
n >>>= 1;
148+
}
149+
return result;
150+
}
151+
}

0 commit comments

Comments
 (0)