[プログラマ]2つ以上のビット数


https://programmers.co.kr/learn/courses/30/lessons/77885#qna

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である.xLSB1に変更して終了です.
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개 다른 수들 중에서 제일 작은 수では、どの01に変更すればいいのでしょうか.最小の数を見つけるため、LSBから、初めて会った01に変更してこそ、最小の値が得られます.
    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)