2017-01-05 16 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.你會得到5,你需要3.你計算_all_數組1,而你必須保留最長的一個。 –

+0

什麼情況下沒有通過?它在這些情況下做了什麼?請按照發布指南的要求顯示這些信息。 – Prune

+0

這也不應該與您的測試案例,但你的二進制倒退 – depperm

回答

5

是一個簡化的版本,它致力於二進制表示

def func(num): 
    return max(map(len, bin(num)[2:].split('0'))) 
  • 轉換整數bin(num)

  • 條從二進制表示bin(num)[:2]

  • 分割上字符0的串0B bin(num)[2:].split('0')

  • 發現具有最大長度的字符串,返回數字

+0

@ Jean-FrançoisFabre我用解釋更新了答案 –

+0

我更喜歡那個。我現在沒有注意力(不開玩笑)。你可以嘗試用簡單的'len'改變'lambda'嗎?會更清晰。 –

+0

@ Jean-FrançoisFabre完成了!感謝您的想法.. :) –

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

你的反邏輯是在幾個方面的,男不正確法布爾確定了主要的一個。結果是您計算了所有組合後續1的總數量,並將計數器的初始值加1。流氓人給了你一個可愛的Pythonic解決方案。在級使用修復此,進入ADJ和修復...

  1. 不要使用計數器功能之外;保持本地。
  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

下面所寫的代碼輸出會給輸入十進制數連續一個人的最大數量。

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 
相關問題