鱼C论坛

 找回密码
 立即注册
查看: 9079|回复: 64

[已解决]Python:每日一题 345

[复制链接]
发表于 2020-3-6 19:37:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


给定一个整数 num,将其转化为二进制,可以将一个数位从 0 变为 1。

编写一个函数,找出你能够获得的最长一串 1 的长度。

说明:可以在转化后的二进制数前添加任意个 0 。

示例 1:

输入:num = 1775 (110111011112)
输出:8
解释:将 num 转化为二进制后变成 11011111111,最长的一串 1 有 8 个 1 。
示例 2:

输入:num = 7 (01112)
输出:4


欢迎大家一起答题!
最佳答案
2020-3-6 21:50:07
风魔孤行者 发表于 2020-3-6 21:05
当输入19的时候,转化为二进制是10011,输出应该是3。这种方法把00给忽略了

多谢指正

  1. import re


  2. def f_345(num: int) -> int:

  3.     num_bin_str = str(bin(num))[2:]
  4.     one_group_lst = re.split(r'0.*?', num_bin_str)
  5.     zero_group_lst = re.findall(r'0.*?', num_bin_str)
  6.     max_length = max([len(i) for i in one_group_lst]) + 1
  7.     for i in range(len(zero_group_lst)):
  8.         if zero_group_lst[i] == '0' and i < len(one_group_lst):
  9.             max_length = len(one_group_lst[i]) + len(one_group_lst[i+1]) + 1 if len(one_group_lst[i]) + len(one_group_lst[i+1]) + 1 > max_length else max_length

  10.     return max_length

  11. print(f_345(19))
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-6 19:51:20 | 显示全部楼层
示例2不应该输出3么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-3-6 19:52:01 | 显示全部楼层
l0stparadise 发表于 2020-3-6 19:51
示例2不应该输出3么?

不是,可以将 0111 中的 0 变为 1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 19:55:32 | 显示全部楼层
zltzlt 发表于 2020-3-6 19:52
不是,可以将 0111 中的 0 变为 1

也就是说,可以改变其中的一个0为1,是吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 19:56:07 | 显示全部楼层
蒋博文 发表于 2020-3-6 19:55
也就是说,可以改变其中的一个0为1,是吧

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:04:18 | 显示全部楼层
就是找到连续最长1的长度,是吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 20:04:56 | 显示全部楼层
fan1993423 发表于 2020-3-6 20:04
就是找到连续最长1的长度,是吧?

是,可以将一个 0 改为一个 1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:15:56 | 显示全部楼层
本帖最后由 kinkon 于 2020-3-6 20:39 编辑
  1. def f345(num):
  2.     res = bin(num)[2:]        
  3.     wz = [-1]+[i for i in range(len(res)) if not int(res[i])]+[len(res)]
  4.     cout = 0
  5.     if len(wz)-2 <= 0: return len(res)+1   
  6.     for i in range(1,len(wz)-1):
  7.         cout = max(wz[i+1]-wz[i-1]-1,cout)
  8.     return cout
  9. print(f345(1775))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-6 20:18:10 | 显示全部楼层
  1. """
  2. 给定一个整数 num,将其转化为二进制,可以将一个数位从 0 变为 1。
  3. 编写一个函数,找出你能够获得的最长的一串 1 的长度。
  4. 说明:可以在转化后的二进制数前添加任意个 0 。
  5. """
  6. def day345(num):
  7.     if num == 0:
  8.         print('1')
  9.         return None

  10.     numb = '0' + bin(num)[2:]
  11.     l = len(numb)
  12.     zero_list = []
  13.     n = 0
  14.     for i in range(l):
  15.         if numb[i] == '1':
  16.             n += 1
  17.         else:
  18.             zero_list.append([i, n])
  19.             n = 0
  20.     zero_list.append([l, n])

  21.     l = len(zero_list)
  22.     max = -1
  23.     for i in range(l-1):
  24.         if zero_list[i+1][0] - zero_list[i][0] > 1:
  25.             if zero_list[i+1][1] + zero_list[i][1] > max:
  26.                 max = zero_list[i+1][1] + zero_list[i][1]
  27.     #print(numb, zero_list)
  28.     print(str(max + 1))

  29. day345(1775)
复制代码


请版主帮忙测试

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:21:16 | 显示全部楼层
  1. import re


  2. def f_345(num: int) -> int:
  3.     num_bin_str = '0'+str(bin(num))[2:]
  4.     one_group_lst = sorted(re.split(r'0', num_bin_str), key=lambda x: len(x), reverse=True)
  5.     length = len(one_group_lst[0]) + len(one_group_lst[1]) + 1
  6.     return length

  7. print(f_345(1775))
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:46:07 | 显示全部楼层
  1. n = int(input('请输入:'))
  2. def f(n):
  3.     n = bin(n)
  4.     string = '0' + str(n)[2:]
  5.     count = 0
  6.     b = 0
  7.     while string != '':
  8.         a = string.find('0')
  9.         if a == -1:
  10.             if b+len(string) >count:
  11.                 count = b+len(string)
  12.             break
  13.         else:
  14.             if a+b >count:
  15.                 count = a+b
  16.             b = a+1
  17.             string = string[a+1:]
  18.     return count
  19. print(f(n))
复制代码



评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:48:47 | 显示全部楼层
本帖最后由 塔利班 于 2020-3-7 19:44 编辑
  1. def f345(x):
  2.     s=('0'+bin(x)[2:]).split('0')
  3.     m=1
  4.     for i,e in enumerate(s):
  5.         if e:
  6.             if s[i-1]:
  7.                 m=max(m,len(s[i-1])+1+len(e))
  8.             else:
  9.                 m=max(m,1+len(e))
  10.     return m
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:50:22 | 显示全部楼层
  1. from itertools import groupby
  2. def fun345(num):
  3.     t=[]
  4.     for k,v in groupby(bin(num)[2:]):
  5.         t.append(len(list(v)))
  6.     if len(t)==1 or len(t)==2:return t[0]+1
  7.     count,result=0,0
  8.     if bin(num)[-1]=='1':
  9.         for i in range(1,len(t),2):
  10.             if t[i]==1:
  11.                 result=max(count,t[i-1]+t[i+1]+1)
  12.                 count=result
  13.             else:
  14.                 result=max(count,t[i-1]+1,t[i+1]+1)
  15.                 count=result
  16.     else:
  17.         for i in range(1,len(t)-1,2):
  18.             if t[i]==1:
  19.                 result=max(count,t[i-1]+t[i+1]+1)
  20.                 count=result
  21.             else:
  22.                 result=max(count,t[i-1]+1,t[i+1]+1)
  23.                 count=result
  24.     return result
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:53:34 | 显示全部楼层
来晚了,又抢不到第一了
  1. def fun345(num):
  2.     bit = '{0:b}'.format(num)
  3.     M = len(bit)
  4.    
  5.     Zero_Only_Position = []
  6.     One_Count = []

  7.     index = 0
  8.     count = 0
  9.     signal = 0
  10.     while index < M:
  11.         if bit[index] == '1':
  12.             count += 1
  13.         else:
  14.             try:
  15.                 if bit[index-1]=='1':
  16.                     One_Count.append(count)
  17.                     count = 0
  18.                     try:
  19.                         if bit[index+1]=='1':
  20.                             Zero_Only_Position.append(signal)
  21.                     except Exception:
  22.                         pass
  23.                     signal += 1
  24.             except Exception:
  25.                 pass
  26.         index += 1
  27.     else:
  28.         if bit[M-1]=='1':
  29.             One_Count.append(count)
  30.    
  31.     tempMax = max(One_Count)+1
  32.     for each in Zero_Only_Position:
  33.         tempMax = max((tempMax,1 + One_Count[each] + One_Count[each+1]))
  34.     return tempMax  
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:56:26 | 显示全部楼层
  1. def solve(num):
  2.     num = '0' + str(bin(num))[2:] + '0'
  3.     m = 1
  4.     for i in range(len(num)):
  5.         if num[i] == '0':
  6.             l=i-1
  7.             r=i+1
  8.             while l >= 0 and num[l] == '1':
  9.                 l -= 1
  10.             while r < len(num) and num[r] == '1':
  11.                 r += 1
  12.             if r-l-1 > m:
  13.                 m = r-l-1
  14.     return m
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 21:05:15 | 显示全部楼层

当输入19的时候,转化为二进制是10011,输出应该是3。这种方法把00给忽略了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 21:13:36 | 显示全部楼层
本帖最后由 一个账号 于 2020-3-7 13:09 编辑

请楼主帮忙测试:

  1. def func(num):
  2.     str1 = "0"+str(bin(num))[2:]
  3.     list1, length = [], []
  4.     flag = False
  5.     for x in range(len(str1)):
  6.         for y in range(x, len(str1)):
  7.             if str1[y] == "0":
  8.                 if flag: break
  9.                 flag = True
  10.             list1.append(str1[y])
  11.         flag = False
  12.         length.append(len(list1))
  13.         list1 = []
  14.     return max(length)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 21:25:30 | 显示全部楼层
  1. import re

  2. def test(num):
  3.     bin_num = bin(num)[2:]
  4.     num_list = re.split(r'(?<=1)(0+)(?=1|$)', bin_num)
  5.     result = len(num_list[0]) + 1
  6.     for i in range(len(num_list)):
  7.         if '0' in num_list[i]:
  8.             if num_list[i] == '0':
  9.                 result = max(result, len(num_list[i-1]) + len(num_list[i+1]) + 1)
  10.             else:
  11.                 result = max(result, len(num_list[i-1]) + 1, len(num_list[i+1]) + 1)
  12.     return result
复制代码


越寫越暈

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 21:42:52 | 显示全部楼层
本帖最后由 一个账号 于 2020-3-7 13:02 编辑
  1. def func345(num):
  2.     res = '0'+bin(num)[2:]+'0'
  3.     temp =[]
  4.     flag =[]
  5.     for i in range(len(res)):
  6.         if(res[i]=='0'):
  7.             temp.append(i)
  8.     if len(temp)>2:
  9.         for i in range(len(temp)-2):
  10.             flag.append(temp[i+2]-temp[i]-1)
  11.     else:
  12.         flag.append(len(res)-1)
  13.     return max(flag)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 21:50:07 | 显示全部楼层    本楼为最佳答案   
风魔孤行者 发表于 2020-3-6 21:05
当输入19的时候,转化为二进制是10011,输出应该是3。这种方法把00给忽略了

多谢指正

  1. import re


  2. def f_345(num: int) -> int:

  3.     num_bin_str = str(bin(num))[2:]
  4.     one_group_lst = re.split(r'0.*?', num_bin_str)
  5.     zero_group_lst = re.findall(r'0.*?', num_bin_str)
  6.     max_length = max([len(i) for i in one_group_lst]) + 1
  7.     for i in range(len(zero_group_lst)):
  8.         if zero_group_lst[i] == '0' and i < len(one_group_lst):
  9.             max_length = len(one_group_lst[i]) + len(one_group_lst[i+1]) + 1 if len(one_group_lst[i]) + len(one_group_lst[i+1]) + 1 > max_length else max_length

  10.     return max_length

  11. print(f_345(19))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 08:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表