Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将给定的十进制数转换为二进制数,对连续的1进行计数并显示_Python - Fatal编程技术网

Python 将给定的十进制数转换为二进制数,对连续的1进行计数并显示

Python 将给定的十进制数转换为二进制数,对连续的1进行计数并显示,python,Python,问题:将给定的十进制数转换为二进制数,计算连续的1并显示它 示例案例1: 5的二进制表示为101,因此连续1的最大数量为1 示例案例2: 13的二进制表示为1101,因此连续1的最大数量为2 解决方案: #!/bin/python3 import sys n = int(input().strip()) result = [] counter = 1 def get_binary(num): if num == 1: result.append(num)

问题:将给定的十进制数转换为二进制数,计算连续的1并显示它

示例案例1: 5的二进制表示为101,因此连续1的最大数量为1

示例案例2: 13的二进制表示为1101,因此连续1的最大数量为2

解决方案:

#!/bin/python3

import sys


n = int(input().strip())
result = []
counter = 1
def get_binary(num):
    if num == 1:
        result.append(num)
        adj(result)
    else:
        result.append(num%2)
        get_binary(int(num/2))

def adj(arr):
    global counter
    for x in range(0,len(arr)-1):
        if arr[x] == 1 and (arr[x] == arr[x+1]):
            counter += 1
    print(counter)

get_binary(n)

它并没有通过所有的样本测试用例。我做错了什么?

下面是一个简单的版本

def func(num):
  return max(map(len, bin(num)[2:].split('0')))
  • 将整数转换为二进制表示形式
    bin(num)

  • 从二进制表示形式中剥离0b
    bin(num)[:2]

  • 拆分字符0
    bin(num)[2:]上的字符串。拆分('0')

  • 查找具有最大长度的字符串并返回数字


    • 这里有一个使用
      regex的替代解决方案:

      >>> import re
      >>> def bn(i):
      ...     n = bin(i)[2:]
      ...     return n,max(len(j) for j in re.findall(r'1+', n))
      ...
      >>>
      >>> bn(13)
      ('1101', 2)
      >>> bn(25)
      ('11001', 2)
      

      你的反逻辑在几个方面是不正确的,法布尔先生指出了主要的一个。结果是计算所有组合序列中后续1的总数,并从计数器的初始值中加1。流氓一号给了你一个可爱的蟒蛇解决方案。要在您的使用级别修复此问题,请进入adj并修复

    • 在函数外部不使用计数器;把它放在本地
    • 创建第二个变量,这是迄今为止找到的最好的字符串
    • 对当前字符串使用计数器;当你达到0时,与目前为止最好的进行比较,重置计数器,然后继续\
    • 核心逻辑是类似于

      best = 0
      counter = 0
      for bit in arr:
          if bit == 1:
              counter += 1
          else:
              if counter > best:
                  best = counter
              counter = 0
      
      # After this loop, make one last check, in case you were on the longest
      #   run of 1s when you hit the end of the bits.
      # I'll leave that coding to you.
      

      这里有一些聪明的答案,我想我应该使用传统的高效命令式方法添加一个替代方法

      此方法首先将数字转换为字符串二进制表示形式。从那里它更新最长值的堆栈,并检查是否有更长的值要添加。因此,您将得到一组按最长连续1排序的值。要选择最大值,只需从堆栈中选择
      pop()

      def longest_consecutive_one(n):
          stack = [0]
          counter = 0
          binary_num = '{0:08b}'.format(n)
          length = len(binary_num) - 1
          for index, character in enumerate(binary_num):
              if character == "1":
                  counter += 1
              if character == '0' or index == length:
                  if stack[-1] < counter:
                      stack.append(counter)
                      counter = 0
          return stack.pop()
      

      以下书面代码的输出将给出输入十进制数中连续一个的最大数

          n = int(raw_input().strip())
          num = list((bin(n).split('b'))[1])
          num.insert(0,'0')
          num.append('0')
          count = 0
          store = 0
          for i in range(0,len(num)):
              if ((num[i]) == '1'):
                  count+=1
              elif ('0' == (num[i])) and count !=0:
                  if count >= store:
                      store = count
                  count = 0
          print store
      

      这一个使用位魔法

      def maxConsecutiveOnes(x): 
      
          # Initialize result 
          count = 0
      
          # Count the number of iterations to 
          # reach x = 0. 
          while (x!=0): 
      
              # This operation reduces length 
              # of every sequence of 1s by one. 
              x = (x & (x << 1)) 
      
              count=count+1
      
          return count 
      
      # Driver code 
      print(maxConsecutiveOnes(14)) 
      print(maxConsecutiveOnes(222))
      
      def MAXCONSUTIVEONES(x):
      #初始化结果
      计数=0
      #计算要执行的迭代次数
      #达到x=0。
      而(x!=0):
      #此操作缩短了长度
      #每一个1乘1的序列。
      x=(x&(x
      #包括
      使用名称空间std;
      int main()
      {
      int n;
      整数计数=0,最小值=0;
      cin>>n;
      对于(int i=0;n>0;i++)
      {
      如果(n%2==1)
      {
      计数++;
      如果(计数>分钟)
      {
      最小值=计数;
      }
      }
      其他的
      {
      计数=0;
      }
      n=n/2;
      }
      
      我认为第一个答案是最好的。我用了类似的方式,可能更容易理解

      import sys
      if __name__ == '__main__':
          n = int(input())
          bina=str(format(n,'b'))
          holder=bina.split('0')
          max_num = max(holder,key=len)
          print(len(max_num))
          
      

      尝试使用115。你将得到5,你需要3。你正在计算1的所有数组,而你必须保留最长的一个。什么情况下它不通过?在这些情况下它做什么?请按照发布指南的要求显示这些。这对你的测试用例也不重要,但你的二进制是backwards@Jean-弗朗索瓦·法布我用这个得到4分代码。哦,那是因为最后一个1的字符串被算错了。4确实是。加倍错误。@Jean-Françoisfare我用解释更新了答案。我更喜欢这样。我现在没有投票了(不是开玩笑)。你能试着用一个简单的
      len
      来更改
      lambda吗?会更清晰。@Jean-Françoisfare done!!谢谢你的想法:)现在你的帖子开始看起来不错了:)这些二进制操作问题总是通过转换成二进制字符串并操纵字符串来结束。这总是让我感到沮丧,因为我想做所有有点移位的事情……BTW,我忍不住编辑你的答案来添加<代码>返回< /Cord>语句:)语言WPython,而不是C++。
      
      #include<bits/stdc++.h>
      using namespace std;
      int main()
      {
          int n;
          int count=0,min=0;
          cin>>n;
          for(int i=0;n>0;i++)
          {
              if(n%2==1)
                      {
      
                      count++;
                        if(count>min)
                         {
                           min=count;
      
                         }
                      }
                  else
                      {
                       count=0;
                       }
              n = n/2;
      
          }
             cout<<min<<endl;
          return 0;
      }
      
      import sys
      if __name__ == '__main__':
          n = int(input())
          bina=str(format(n,'b'))
          holder=bina.split('0')
          max_num = max(holder,key=len)
          print(len(max_num))