Подсчет последовательных единиц в двоичном числе

#python #python-3.x

#python #python-3.x

Вопрос:

Это проблема с кодом 10-го дня ХакеррАнка (30 дней проверки кода)

Я разобрался с большей частью части, но я застрял в той части, где вам нужно подсчитать количество последовательных единиц в двоичном представлении.

Код отлично работает для последовательных единиц в начале или в середине всей серии, но для последовательных единиц в конце я не могу понять, что делать

 cons = 0
def bin_no():
    global rem, cons
    
    #Input
    n = int(input("Enter Number : ")) 
    rem=[]
    
    #Checking If The Number Is Valid Or Not.
    if n < 0:
        print("Please Enter A Valid Number : ")
        bin_no()
    elif n == 0:
        print('0000')
        
    #While Loop for Conversion
    while n >=1 :   
        rem.append(n%2)
        n = n//2
    rem.reverse()
    print("Binary Representation ",*rem, sep = '')

    #Finding Maximum Consecutive 1s.
    maxcon = 0
    for x in rem:
        if x == 1:
            cons  = 1
        elif x != 1 and cons > maxcon:
            maxcon = cons
            cons = 0
                    
    print(maxcon)

    
bin_no()
  

Вы можете увидеть максимальный последовательный блок кода 1s ближе к концу кода.

Я знаю, что ошибка вызвана тем, что конец списка не содержит ни одного элемента, который

не равно 1

Таким образом, конечный elif блок кода игнорируется.

Комментарии:

1. Пожалуйста, добавьте несколько тестовых примеров с вводом и ожидаемым результатом для большей ясности

Ответ №1:

Вам необходимо настроить условие для проверки максимальности после самого цикла, если, как вы упомянули, максимальные последовательные единицы приближаются к концу:

 #Finding Maximum Consecutive 1s.
    maxcon, cons = 0, 0
    for x in rem:
        if x == 1:
            cons  = 1
        elif x != 1 and cons > maxcon:
            maxcon = cons
            cons = 0
    maxcon = max(maxcon, cons)
  

^^ Это должно исправить

Редактировать

Кстати, я придумал более элегантное решение, которое не требует преобразования числа в его двоичный формат:

 N = int(14)

cons, maxcon = 0, 0
while N > 0:
    if N amp; 1:
        cons  = 1
    else:
        maxcon = max(cons, maxcon)
        cons = 0
    N >>= 1

maxcon = max(cons, maxcon)
print(maxcon)
  
 3
  

Ответ №2:

Редактирование Serial Lazer — это, безусловно, правильный путь, но я просто хотел исправить их первый ответ.

 def consec_ones_a(rem):
    count, largest = 0, 0
    for x in rem:
        if x == 1:
            count  = 1
        else:
            if count > largest:
                largest = count
            count = 0
    return max(largest, count)
    
def consec_ones_b(rem):
    maxcon, cons = 0, 0
    for x in rem:
        if x == 1:
            cons  = 1
        elif x != 1 and cons > maxcon:
            maxcon = cons
            cons = 0
    return max(maxcon, cons)

# 4 consecutive 1s
binary = [1,1,1,0,1,0,1,1,1,1]
print(consec_ones_a(binary))
print(consec_ones_b(binary))
  

выводит

 4
5