Me gustaría saber si mi implementación es eficiente. He tratado de encontrar la solución más simple y menos compleja para ese problema usando python.
def count_gap(x): """ Perform Find the longest sequence of zeros between ones "gap" in binary representation of an integer Parameters ---------- x : int input integer value Returns ---------- max_gap : int the maximum gap length """ try: # Convert int to binary b = "{0:b}".format(x) # Iterate from right to lift # Start detecting gaps after fist "one" for i,j in enumerate(b[::-1]): if int(j) == 1: max_gap = max([len(i) for i in b[::-1][i:].split('1') if i]) break except ValueError: print("Oops! no gap found") max_gap = 0 return max_gapDéjame saber tu opinión.
Me doy cuenta de que la brevedad no significa legibilidad ni eficiencia.
Sin embargo, la capacidad de deletrear la solución en lenguaje hablado e implementarla en Python en poco tiempo constituye un uso eficiente de mi tiempo.
Para la brecha binaria: hey, vamos a convertir int en binario, eliminar los ceros finales, dividir en '1' para listar, luego encontrar el elemento más largo en la lista y obtener la longitud de este elemento.
def binary_gap(N): return len(max(format(N, 'b').strip('0').split('1')))Su implementación convierte el número entero en una cadena de base dos y luego visita cada carácter de la cadena. En su lugar, podría simplemente visitar cada bit en el entero usando << y & . Si lo hace, evitará visitar cada bit dos veces (primero para convertirlo en una cadena, luego para verificar si es un "1" o no en la cadena resultante). También evitará asignar memoria para la cadena y luego para cada subcadena que inspeccione.
Puede inspeccionar cada bit del entero visitando 1 << 0, 1 << 1, ..., 1 << (x.bit_length).
Por ejemplo:
def max_gap(x): max_gap_length = 0 current_gap_length = 0 for i in range(x.bit_length()): if x & (1 << i): # Set, any gap is over. if current_gap_length > max_gap_length: max_gap_length = current_gap_length current_gap_length = 0 else: # Not set, the gap widens. current_gap_length += 1 # Gap might end at the end. if current_gap_length > max_gap_length: max_gap_length = current_gap_length return max_gap_lengthdef max_gap(N): xs = bin(N)[2:].strip('0').split('1') return max([len(x) for x in xs])Explicación: