[プログラマ]2つ以上のビット数
https://programmers.co.kr/learn/courses/30/lessons/77885#qna
1.完全なコード
第1条件
第2条件
ex)
2番目の0ビットを1:
3番目の0ビットを1:
今では1つのビットを交換し、もう1つのビットを交換して値を小さくすることができます.
1.完全なコード def solution(numbers):
answer = []
for num in numbers:
temp = bin(num)[2:]
# 짝수
if num % 2 == 0:
answer.append(num + 1)
continue
# 홀수
bi = '0' + temp # 비트수 초과 방지
find = bi.rfind('0') # LSB(최하위 비트) 부터 탐색하여 처음으로 만나는 '0' 비트의 index
temp = list(bi)
temp[find] = '1'
temp[find + 1] = '0'
answer.append(int(''.join(temp), 2))
return answer
print(solution([2, 7]))
2.後期
1 .
単純な回転ドアでタイムアウトが発生します.numbers
の範囲を見るには、すぐに捕まえます.
2 .
偶数の場合、すべての偶数のLSB(최하위비트)
は、常に0
である.x
のLSB
を1
に変更して終了です.
ex) 1100(x = 12)
-> 1101(x + 1 = 13)
奇数の場合は111(x = 7)
、10101(x = 21)
の2種類があります.前者のすべてのビットは1
であるため、x
より大きい値を表すことはできない.だから0
を一番前に貼って、0111
の形態に修正します.後者は問題ありません.
def solution(numbers):
answer = []
for num in numbers:
temp = bin(num)[2:]
# 짝수
if num % 2 == 0:
answer.append(num + 1)
continue
# 홀수
bi = '0' + temp # 비트수 초과 방지
find = bi.rfind('0') # LSB(최하위 비트) 부터 탐색하여 처음으로 만나는 '0' 비트의 index
temp = list(bi)
temp[find] = '1'
temp[find + 1] = '0'
answer.append(int(''.join(temp), 2))
return answer
print(solution([2, 7]))
1 .
単純な回転ドアでタイムアウトが発生します.
numbers
の範囲を見るには、すぐに捕まえます.2 .
偶数の場合、すべての偶数の
LSB(최하위비트)
は、常に0
である.x
のLSB
を1
に変更して終了です.ex)
1100(x = 12)
-> 1101(x + 1 = 13)
奇数の場合は111(x = 7)
、10101(x = 21)
の2種類があります.前者のすべてのビットは1
であるため、x
より大きい値を表すことはできない.だから0
を一番前に貼って、0111
の形態に修正します.後者は問題ありません.第1条件
x보다 큰 수
010101(x = 21)
より大きい数字を見つけるには、1
を変更することはできません.したがって、1
を有する任意のビットは、0
に変更されると、既存のx
の値よりも無条件に小さくなる.したがって、既存の値よりも大きい必要がある最初の条件を満たすには、0 -> 1
が必要である.第2条件
비트가 1~2개 다른 수들 중에서 제일 작은 수
では、どの0
を1
に変更すればいいのでしょうか.最小の数を見つけるため、LSB
から、初めて会った0
を1
に変更してこそ、最小の値が得られます.ex)
010101(x = 21)
最初に遭遇した0ビットを1:010111(= 23)
->xの値の中で最小に変更します.2番目の0ビットを1:
011101(= 29)
に変更3番目の0ビットを1:
110101(= 53)
に変更今では1つのビットを交換し、もう1つのビットを交換して値を小さくすることができます.
1
のビットの隣の右側のビットを0
に変えればいいです.上のビット(左)ほどビットが表す値が大きくなるので、左のビットを最大限に0
に変更すると、値が小さくなります.010101(x = 21) -> 010111(= 23) -> 010110(= 22)
Reference
この問題について([プログラマ]2つ以上のビット数), 我々は、より多くの情報をここで見つけました https://velog.io/@legowww/프로그래머스-2개-이하로-다른-비트テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol