1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Solution {
public long[] solution(long[] numbers) {
long[] answer = new long[numbers.length];
for (int i = 0; i < numbers.length; i++) {
long num = numbers[i];
if (num % 2 == 0)
answer[i] = num + 1;
else {
String s = Long.toBinaryString(num);
int idx = s.lastIndexOf("0");
// 가장 끝부분의 0을 1로 변환하고 그 뒷자리를 0으로 변환
if (idx == -1)
s = "10" + s.substring(1);
else
s = s.substring(0, idx) + "10" + s.substring(idx + 2);
answer[i] = Long.parseLong(s, 2);
}
}
return answer;
}
}
|
cs |
전체 비트를 카운트하면 시간초과가 난다.
각 비트마다의 규칙을 이용하여 해결하였다.
짝수 : num + 1
홀수 : 끝부분의 0을 1로, 그 다음 수를 0으로 변환
이전에 시간초과가 났던 코드는 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Solution {
public long[] solution(long[] numbers) {
long[] answer = new long[numbers.length];
for (int i = 0; i < numbers.length; i++) {
long num = numbers[i];
long j = num + 1;
// 비트가 다른 갯수가 2이하이면 종료
while (Long.bitCount(num ^ j++) > 2);
answer[i] = j - 1;
}
return answer;
}
}
|
cs |
XOR 연산으로 시도했지만 시간초과가 났다.