- 비트 문제
https://leetcode.com/problems/number-complement/description/?envType=daily-question&envId=2024-08-22
- 문제분석
1. 5 = "101" bit 일때, 뒤집는다면, "010" 이되고, 010 = 2 값이나온다.
2. 앞에 0의 숫자를 버릴때 각 숫자의 bit 를 reverse 한 값을 구하여라.
- 문제풀이
1. Integer.toBinaryString() 함수로 숫자의 bit 값을 String 으로 구한다.
2. for 문으로 1 일때는 0, 0 일때는 1로 치환하여 StringBuilder 로 각 값을 String 으로 합친다.
3. Integer.parseInt(bit, 2) 함수로 Bit String 값을 10진수로 변환하여 리턴한다.
class Solution {
public int findComplement(int num) {
String b = Integer.toBinaryString(num);
int n = b.length();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
char c = b.charAt(i);
if (c == '0') {
sb.append("1");
} else {
sb.append("0");
}
}
return Integer.parseInt(sb.toString(), 2);
}
}
- 문제풀이2
1. int num 값을 ~(not bit) 로 reverse 한 bit 값을 구한다.
1-1. 이때 5 = 101 경우 32지수까지 000000... 101 -> 11111...010 이 출력되게된다.
2. Integer.highestOneBit(num) 함수로 num 숫자의 최대 bit 값을 구한다.
2-1. 5 일경우 101 -> 100
3. Integer.highestOneBit(num) 에서 1을 빼서 최대 bit 값의 reverse 한 값을 구한다.
3-1. 4일경우 100 -> 011
4. ~num & Integer.highestOneBit(num) 으로 중복된 값만 출력한다.
5. 010 & 011 -> 010 (2)
class Solution {
public int findComplement(int num) {
return ~num & (Integer.highestOneBit(num) - 1);
}
}
'TIL' 카테고리의 다른 글
[코테연습] 1514. Path with Maximum Probability (0) | 2024.08.27 |
---|---|
[코테연습] 590. N-ary Tree Postorder Traversal (0) | 2024.08.26 |
[코테연습] n^2 배열자르기 (0) | 2024.08.20 |
[코테연습] 650. 2 Keys Keyboard (0) | 2024.08.19 |
[코테연습] 624. Maximum Distance in Arrays (0) | 2024.08.16 |