鱼C论坛

 找回密码
 立即注册
查看: 5593|回复: 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给忽略了

多谢指正
import re


def f_345(num: int) -> int:

    num_bin_str = str(bin(num))[2:]
    one_group_lst = re.split(r'0.*?', num_bin_str)
    zero_group_lst = re.findall(r'0.*?', num_bin_str)
    max_length = max([len(i) for i in one_group_lst]) + 1
    for i in range(len(zero_group_lst)):
        if zero_group_lst[i] == '0' and i < len(one_group_lst):
            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

    return max_length

print(f_345(19))

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-6 19:51:20 | 显示全部楼层
示例2不应该输出3么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

不是,可以将 0111 中的 0 变为 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

也就是说,可以改变其中的一个0为1,是吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:04:18 | 显示全部楼层
就是找到连续最长1的长度,是吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是,可以将一个 0 改为一个 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

    numb = '0' + bin(num)[2:]
    l = len(numb)
    zero_list = []
    n = 0
    for i in range(l):
        if numb[i] == '1':
            n += 1
        else:
            zero_list.append([i, n])
            n = 0
    zero_list.append([l, n])

    l = len(zero_list)
    max = -1
    for i in range(l-1):
        if zero_list[i+1][0] - zero_list[i][0] > 1:
            if zero_list[i+1][1] + zero_list[i][1] > max:
                max = zero_list[i+1][1] + zero_list[i][1]
    #print(numb, zero_list)
    print(str(max + 1))

day345(1775)

请版主帮忙测试

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

print(f_345(1775))

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:46:07 | 显示全部楼层
n = int(input('请输入:'))
def f(n):
    n = bin(n)
    string = '0' + str(n)[2:]
    count = 0
    b = 0
    while string != '':
        a = string.find('0')
        if a == -1:
            if b+len(string) >count:
                count = b+len(string)
            break
        else:
            if a+b >count:
                count = a+b
            b = a+1
            string = string[a+1:]
    return count
print(f(n))


评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:50:22 | 显示全部楼层
from itertools import groupby
def fun345(num):
    t=[]
    for k,v in groupby(bin(num)[2:]):
        t.append(len(list(v)))
    if len(t)==1 or len(t)==2:return t[0]+1
    count,result=0,0
    if bin(num)[-1]=='1':
        for i in range(1,len(t),2):
            if t[i]==1:
                result=max(count,t[i-1]+t[i+1]+1)
                count=result
            else:
                result=max(count,t[i-1]+1,t[i+1]+1)
                count=result
    else:
        for i in range(1,len(t)-1,2):
            if t[i]==1:
                result=max(count,t[i-1]+t[i+1]+1)
                count=result
            else:
                result=max(count,t[i-1]+1,t[i+1]+1)
                count=result
    return result

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:53:34 | 显示全部楼层
来晚了,又抢不到第一了
def fun345(num):
    bit = '{0:b}'.format(num)
    M = len(bit)
    
    Zero_Only_Position = []
    One_Count = []
 
    index = 0
    count = 0
    signal = 0
    while index < M:
        if bit[index] == '1':
            count += 1
        else:
            try:
                if bit[index-1]=='1':
                    One_Count.append(count)
                    count = 0
                    try:
                        if bit[index+1]=='1':
                            Zero_Only_Position.append(signal)
                    except Exception:
                        pass
                    signal += 1
            except Exception:
                pass
        index += 1
    else:
        if bit[M-1]=='1':
            One_Count.append(count)
    
    tempMax = max(One_Count)+1
    for each in Zero_Only_Position:
        tempMax = max((tempMax,1 + One_Count[each] + One_Count[each+1]))
    return tempMax  

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 20:56:26 | 显示全部楼层
def solve(num):
    num = '0' + str(bin(num))[2:] + '0'
    m = 1
    for i in range(len(num)):
        if num[i] == '0':
            l=i-1
            r=i+1
            while l >= 0 and num[l] == '1':
                l -= 1
            while r < len(num) and num[r] == '1':
                r += 1
            if r-l-1 > m:
                m = r-l-1
    return m

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

当输入19的时候,转化为二进制是10011,输出应该是3。这种方法把00给忽略了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

请楼主帮忙测试:
def func(num):
    str1 = "0"+str(bin(num))[2:]
    list1, length = [], []
    flag = False
    for x in range(len(str1)):
        for y in range(x, len(str1)):
            if str1[y] == "0":
                if flag: break
                flag = True
            list1.append(str1[y])
        flag = False
        length.append(len(list1))
        list1 = []
    return max(length)

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

def test(num):
    bin_num = bin(num)[2:]
    num_list = re.split(r'(?<=1)(0+)(?=1|$)', bin_num)
    result = len(num_list[0]) + 1
    for i in range(len(num_list)):
        if '0' in num_list[i]:
            if num_list[i] == '0':
                result = max(result, len(num_list[i-1]) + len(num_list[i+1]) + 1)
            else:
                result = max(result, len(num_list[i-1]) + 1, len(num_list[i+1]) + 1)
    return result

越寫越暈

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

多谢指正
import re


def f_345(num: int) -> int:

    num_bin_str = str(bin(num))[2:]
    one_group_lst = re.split(r'0.*?', num_bin_str)
    zero_group_lst = re.findall(r'0.*?', num_bin_str)
    max_length = max([len(i) for i in one_group_lst]) + 1
    for i in range(len(zero_group_lst)):
        if zero_group_lst[i] == '0' and i < len(one_group_lst):
            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

    return max_length

print(f_345(19))

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 08:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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