我如何编写一个python函数来计算一个数字的二进制表示中的连续零?

vsnjm48y  于 2023-02-17  发布在  Python
关注(0)|答案(2)|浏览(135)

给定一个数N,该函数应将该数转换为二进制形式,计算连续零的个数(二进制间隔),并返回最大二进制间隔。例如,9 = 1001,长度为2的二进制间隔。数字529 = 1000010001,有2个长度分别为4和3的二进制间隔。如果数字有2个或更多的二进制间隔,函数应返回最大二进制间隙,即在N = 529的情况下为4。
我试过这个功能:

def solution(N):

  binaryN = bin(N)[2:] 
  n = len(binaryN)

  binaryGap = []

  for i in range(n):
    if binaryN[i] == 0 and binaryN[i + 1] == 0:
      m = len(binaryN)
    else:
      return 0
      binaryGap = binaryGap.append(m)
  return max(binaryGap)

这个函数对所有的N值都返回0,这是不正确的。我如何调试/改进代码以产生准确的结果?

epggiuax

epggiuax1#

看看下面的代码,它可以解决你的问题。
代码是不言自明的,但让我知道在任何疑问的情况下。

    • 代码:**
import sys
num = int(sys.argv[1])

# Function to get the binary gap.

def binaryGapFinder(num):
    binnum = bin(num).replace("0b", "")  # binnum is binary form of the given number.
    i = 0
    x = 0
    x_list = []
    while i <= len(binnum)-1:
        if binnum[i] == "0":
            x += 1
            if i == len(binnum)-1:  # This loop will also consider if binary form is ending with 0. for example: 12 -> 1100
                x_list.append(x)
        else:
            x_list.append(x)
            x = 0
        i += 1
    return f"The Number: {num}\nIt's Binary Form: {binnum}\nMaximum Consecutive 0's: {max(x_list)}"

print(binaryGapFinder(num))
    • 输出:**
python3 /the/path/to/your/script/binarygap.py 529

The Number: 529
It's Binary Form: 1000010001
Maximum Consecutive 0's: 4

python3 /the/path/to/your/script/binarygap.py 12

The Number: 12
It's Binary Form: 1100
Maximum Consecutive 0's: 2

python3 /the/path/to/your/script/binarygap.py 512

The Number: 512
It's Binary Form: 1000000000
Maximum Consecutive 0's: 9
g6ll5ycj

g6ll5ycj2#

这里有几个问题值得一提,以帮助你。(首先要注意的是,在Python中,推荐/最佳实践是对变量名使用全部小写,所以我将在下面的例子中替换它们。)
bin()函数返回一个字符串,所以你应该检查是否等于“0”(或“0”),而不是整数。

if binaryN[i] == "0" and binaryN[i + 1] == "0":

在Python中,你不需要检查字符串(或任何其他可迭代对象)的长度,以便在类似这样的场景中在for循环中使用。例如,你可以替换:

n = len(binaryN)
  for i in range(n):

用更“Python”的方式

for bit in binary_number:

然后你可以使用变量bit(当然你可以随意称呼它,记住好的变量名会使代码更可读)来代替binary_number[index],在这种情况下,对于for循环的每一次迭代,bit都会被binary_number字符串中的下一个字符替换。
从这里开始在代码中:

m = len(binaryN)

将始终是相同的值,即字符串binaryN的总长度。例如,4表示“1001”。)这不是您想要的。
代码return 0的else块中的第一条语句将立即终止函数并返回0,因此binaryGap = binaryGap.append(m)代码将永远不会执行,因为它是不可访问的,因为前面的返回停止了该套件中代码的任何进一步执行。
你已经有了正确的想法,并朝着正确的方向前进,但我不认为你的代码,即使上面的问题得到纠正,将匹配所有可能遇到的二进制数。所以,另一个可能的替代方案(但大致坚持的解决方案,我认为你自己心目中)将是这样的东西,我希望能帮助你:

def solution(n):
    binary_no = bin(n)[2:]
    binary_gaps = []
    gap_counter = 0
    for bit in binary_no:
        if bit == "0":
            gap_counter += 1
        else:
            # Encountered a 1 so add current count of 0's -- if any -- to list and reset gap_counter
            if gap_counter > 0:
                binary_gaps.append(gap_counter)
                gap_counter = 0
    else:
        # A for else suite (block of code) is run when all iterables have been exhausted.
        if gap_counter > 0:
            binary_gaps.append(gap_counter)

    if binary_gaps:  # If there is at least one element in the list
        if len(binary_gaps) > 1:
            return max(binary_gaps)
        else:
            return binary_gaps[0]
    else:
        # The list is empty, so no gaps were found at all. i.e. Binary number was all 1's.
        return 0

print(solution(529))

相关问题