Я пытался решить проблему с лит-кодом. Здесь мне пришлось посчитать количество шагов, пока переменная num
не станет равна 0
. Вот мой код:
class Solution:
def numberOfSteps(self, num: int) -> int:
step = 0
while num != 0:
num //= 2 if not num%2 else num -= 1
step += 1
return step
Вот ошибка вывода консоли:
File "/home/syswraith/main.py", line 3
num //= 2 if not num%2 else num -= 1
^^
SyntaxError: invalid syntax
Что я делаю не так?
Синтаксис if-else должен оцениваться как одно выражение. Что-то вроде num //= 2
или num -=1
— это целое утверждение, а не выражение.
Как упоминал @jonrsharpe, такой синтаксической конструкции не существует. Более того, использование общего if / else
сделает ваш код более читабельным:
if not num % 2:
num //= 2
else:
num -= 1
Вы также можете использовать num % 2 == 0
вместо not num % 2
, чтобы сделать свои намерения более явными.
num //= 2
и num -= 1
являются операторами, но условные выражения требуют выражений (поскольку они должны оценивать значение).
Вы можете использовать выражения присваивания, заключенные в круглые скобки, например:
(num := num // 2) if not num%2 else (num := num - 1)
но лучше вместо этого использовать стандартный оператор if
if num % 2: num -= 1
else: num //= 2
или присвойте условный результат num
.
num = num - 1 if num % 2 else num // 2
Уже упоминалось, что вы не можете выполнить присваивание -=
в операнде выражения, поэтому оно не допускается и в таком условном выражении.
Обратите внимание, что вы можете оптимизировать свой код, учитывая следующие наблюдения:
Каждый 1 бит в двоичном представлении числа в какой-то момент потребует соответствующей операции минус 1.
Каждая цифра в двоичном представлении числа в конечном итоге станет цифрой 0, и все эти цифры, кроме последней, необходимо будет сдвинуть с помощью операции деления на 2.
Это приводит к этому коду:
def numberOfSteps(self, num: int) -> int:
return max(num.bit_length() + num.bit_count() - 1, 0)
Обертка max(, 0)
служит для обработки граничного случая, когда num
равно 0. В этом случае .bit_count()
будет оцениваться как 0, и поэтому нам нужно адаптировать окончательный результат к 0.
Это не имеет ничего общего с циклом, вы не можете нигде иметь два оператора ((дополненного) присваивания) в одной строке. Вам нужно будет сделать, например.
num = num // 2 if ...
.