2つ以下のビット


問題の説明
正の整数xを定義する関数f(x)は、以下のようになります.
  • xより大きく、xとビットの1から2の異なる数の中で最小の数は
  • である.
    たとえば、
  • f(2)=3.2より大きい数字では、ビット数の異なる点は2個未満であり、最小の数は3であるため、以下の表に示す.
  • 수	비트			다른 비트의 개수
    2	000...0010	
    3	000...0011	1
  • f(7)=11.7より大きい数字では、ビット数の異なる点は2個未満であり、最小の数は11であるため、以下の表に示す.
  • 수	비트			다른 비트의 개수
    7	000...0111	
    8	000...1000	4
    9	000...1001	3
    10	000...1010	3
    11	000...1011	2
    パラメータは、整数を含む配列番号です.numbersのすべての数について、解関数を完了し、各数のf値を配列に順次読み込み、返します.
    せいげんじょうけん
  • 1≦数字の長さ≦10000
  • 0≦numbersのすべての数≦1015
  • I/O例
    numbers	result
    [2,7]	[3,11]
    I/O例説明
    I/O例#1
    問題の例を以下に示します.
    方法
    この問題に最初に触れたとき,while文では現在の数字とnumber+i間のXOR演算を用いて,得られた結果値をbin()処理し,1の個数が2の場合を正解とした.答えはいいですが、入力値が大きくなるとcount()関数が時間的に複雑になり、もちろんタイムアウトが発生します.
    だから他のパターンを探しているときに、偶数を入力すると、バイナリで表すと一番後ろに0が加算され、偶数を入力すると、その数より1大きい正解が返ってくることがわかりました.
    奇数の場合、2進数列の一番後ろの01を10に変更できます.バイナリ表示文字列が1のみの場合を防ぐため、先頭に0を付けてバイナリ表示文字列を逆さにし、10が発生した場合は01に変更してループを終了し、int()関数を使用して10進数に変換し、正解を返します.
    テスト7,8,9で実行時エラーが発生し続け、関数呼び出し時にパラメータの前にintを付けて解決しました.テストケースにはint型ではなく入力があるようです.
  • 関数fをnumberとしてパラメータとして宣言します.
    ->numberが偶数の場合はnumber+1を返します.
    ->その他の場合、
    -->bin(number)を一時変数tmpに格納する.
    -->tmp[:2]+'0'+tmp[2:]を介してtmpを前面に追加します.
    -->tmpを反転します.
    -->tmp長が重複するiのfor文.
    -->tmp[i-1]が1tmp[i]で0の場合、
    ------>tmpをtmp[:i-1]+'01'+tmp[i+1:]に更新し、繰り返し文を終了します.
    -->tmp 1は、tmpを反転する文字列のint型を格納する.
    -->tmp 1を返します.
  • の正解を保存したリストの正解はnumberを巡回し、f(int(number))の結果を呼び出して埋め込まれる.
  • の答えを返します.
  • solution.py
    def solution(numbers):
        def f(number):
            if int(number)%2==0:
                return number+1
            else:
                tmp=bin(number)
                tmp=tmp[:2]+'0'+tmp[2:]
                tmp=tmp[::-1]
                for i in range(1, len(tmp)):
                    if tmp[i-1]=='1' and tmp[i]=='0':
                        tmp=tmp[:i-1]+'01'+tmp[i+1:]
                        break
                tmp1=int(tmp[::-1], 2)
                return tmp1
        answer=[f(int(number)) for number in numbers]
        return answer