[在申请暑期实习时遇到了这个编码挑战,但没有被选入下一轮,我很好奇是否可以改善。
问题说:
给出负二进制数(-2)的数字除以2。
例如:
给出[1、0、0、1、1、1](-23),输出为[1、0、1、0、1、1](-11)
给出[0,1,1,1](-12),输出为[0,1,1,1](-6)
注从左到右读取数组。 [1、0、0、1、1、1] = 1 *(-2)^ 0 + 0 *(-2)^ 1 + 0 *(-2)^ 2 + 1 *(-2)^ 3 + 1 *(-2)^ 4 +1 *(-2)^ 5 = 1 + 0 + 0 +(-8)+ 16 +(-32)= -23
我发现的最简单的解决方案是将数字转换为整数,将其除以二,然后将其转换回负二进制数。
感谢您的输入。
我在python中的代码:
import math
def solution(A):
value = math.ceil(calculate_number(A) / 2)
p = convert_number_to_binary(value)
return p
# This function calculates de value of the array
def calculate_number(A):
total = 0
for i in range(0, len(A)):
total += A[i] * (-2) ** i
return total
def convert_number_to_binary(number):
binary = []
if number == 0:
return binary
while number != 0:
number, remainder = divmod(number, -2)
if remainder < 0:
number += 1
remainder -= -2
binary.append(remainder)
return binary
"""
考虑1230 // 10 = 123和1234 // 10 = 123,这意味着您将只修整最后一位数字,您可以尝试对二进制使用相同的概念(二进制以2为底,您要除以2),将能够减少您所做的所有计算,这种方法将更快得多,因为您不需要计算任何东西,而只是忽略了最后一位。