2017-01-05 4 views
2

問題を表示:バイナリに与える進数に変換し、連続した1秒をカウントし、サンプルケース1は バイナリに与える進数に変換し、連続した1秒をカウントし、それに

表示: 5のバイナリ表現であります101、連続する1の最大数は1

サンプルケース2になるように: 13のバイナリ表現1101であるので、連続する1の最大数は2

解決する:

#!/bin/python3 

import sys 


n = int(input().strip()) 
result = [] 
counter = 1 
def get_binary(num): 
    if num == 1: 
     result.append(num) 
     adj(result) 
    else: 
     result.append(num%2) 
     get_binary(int(num/2)) 

def adj(arr): 
    global counter 
    for x in range(0,len(arr)-1): 
     if arr[x] == 1 and (arr[x] == arr[x+1]): 
      counter += 1 
    print(counter) 

get_binary(n) 

すべてのサンプルテストケースを通過するわけではありません。私は間違って何をしていますか?以下

+2

115で試してみてください。3が必要です。最も長いものを保持しなければならないうちに、1の配列を数えています。 –

+0

どのようなケースが合格しないのですか?そのような場合はどうなりますか?掲示のガイドラインに従って、これらを表示してください。 – Prune

+0

これもあなたのテストケースでは問題ありませんが、バイナリが後方にあります – depperm

答えて

5

def func(num): 
    return max(map(len, bin(num)[2:].split('0'))) 
  • 変換整数ストリップ0B

  • bin(num)

  • バイナリ表現のバイナリ表現から bin(num)[:2]

  • は文字0で文字列を分割動作簡略化されたバージョンでありますbin(num)[2:].split('0')

  • 最大の長さを持つ文字列を検索し、ここで

+0

@ Jean-FrançoisFabre説明をもって答えを更新しました –

+0

私はそれがより好きです。私は今、アップホントから外れている(冗談なし)。単純な 'len'で' lambda'を変更してみることができますか?さらに明確になります。 –

+0

@ Jean-FrançoisFabredone! :) –

0

数を返すには、regexを使用して代替ソリューションです:

>>> import re 
>>> def bn(i): 
...  n = bin(i)[2:] 
...  return n,max(len(j) for j in re.findall(r'1+', n)) 
... 
>>> 
>>> bn(13) 
('1101', 2) 
>>> bn(25) 
('11001', 2) 
0

あなたのカウンタ論理は、点のカップルでM正しくありません。 Fabreは主なものを特定した。その結果、すべてのシーケンスの後続1の合計数がカウントされ、カウンタの初期値から1が加算されます。不正な人はあなたに素敵なPythonicの解決策を与えました。使用のあなたレベルでこれを修復するには、

  1. あなたは関数の外カウンターを使用していない... ADJと修正に入ります。それを地元に保つ。
  2. これまでに見つかった最良の文字列の2番目の変数を作成します。
  3. 現在の文字列にはカウンタを使用します。あなたは0を打ったときに、カウンタをリセットし、これまでの最高と比較し、続ける。\

中央論理は、何かのような...

best = 0 
counter = 0 
for bit in arr: 
    if bit == 1: 
     counter += 1 
    else: 
     if counter > best: 
      best = counter 
     counter = 0 

# After this loop, make one last check, in case you were on the longest 
# run of 1s when you hit the end of the bits. 
# I'll leave that coding to you. 
0

ここではいくつかの巧妙な答え、考えられています私は従来の効率的な命令的なアプローチを使って代替案を追加したいと思う。

このメソッドは、最初に数値を文字列バイナリ表現に変換します。そこから、最も長い値のスタックが更新され、追加される値がより長いかどうかがチェックされます。したがって、最長の連続する1でソートされた値のスタックになります。最大値を選択するには、単にスタックからpop()を選択します。

def longest_consecutive_one(n): 
    stack = [0] 
    counter = 0 
    binary_num = '{0:08b}'.format(n) 
    length = len(binary_num) - 1 
    for index, character in enumerate(binary_num): 
     if character == "1": 
      counter += 1 
     if character == '0' or index == length: 
      if stack[-1] < counter: 
       stack.append(counter) 
       counter = 0 
    return stack.pop() 

サンプル出力:以下に書かれたコードの

>>> longest_consecutive_one(190) 
5 
>>> longest_consecutive_one(10) 
1 
>>> longest_consecutive_one(10240) 
1 
>>> longest_consecutive_one(210231) 
6 
0

出力は、入力の10進数で連続した1の数の最大値を与えます。

n = int(raw_input().strip()) 
    num = list((bin(n).split('b'))[1]) 
    num.insert(0,'0') 
    num.append('0') 
    count = 0 
    store = 0 
    for i in range(0,len(num)): 
     if ((num[i]) == '1'): 
      count+=1 
     elif ('0' == (num[i])) and count !=0: 
      if count >= store: 
       store = count 
      count = 0 
    print store 
関連する問題