#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