鱼C论坛

 找回密码
 立即注册
查看: 4026|回复: 67

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

[复制链接]
发表于 2020-3-14 13:27:06 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zltzlt 于 2020-3-14 13:28 编辑

今天的题目:


爱丽丝有一手由整数数组给定的牌(hand)。

现在她想把牌重新排列成组,使得每个组的大小都是 W,且由 W 张连续的牌组成。

如果她可以完成分组就返回 True,否则返回 False。

示例 1:

输入:hand = [1, 2, 3, 6, 2, 3, 4, 7, 8], W = 3
输出:True
解释:爱丽丝的手牌可以被重新排列为 [1, 2, 3],[2, 3, 4] 和 [6, 7, 8] 。
示例 2:

输入:hand = [1, 2, 3, 4, 5], W = 4
输出:False
解释:爱丽丝的手牌无法被重新排列成几个大小为 4 的组。


欢迎大家一起答题!
最佳答案
2020-3-14 19:48:04
zltzlt 发表于 2020-3-14 17:32
解答错误

输入:hand = [1, 2, 3, 4, 5, 6], W = 2
def f(list1,w):
    if len(list1)%w != 0 :
        return False
    else:
        list1.sort()
        while list1:
            a = list1.pop(0)
            try:
                for n in range(1,w):
                    list1.remove(a+n)
            except ValueError:
                return False
        return True
感觉自己脑子里装的都是浆糊

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-3-14 13:29:49 | 显示全部楼层
本帖最后由 蒋博文 于 2020-3-15 17:42 编辑
from collections import Counter
def fun351(hand, W):
    n = len(hand)
    if n % W != 0:
        return False
    hand.sort()
    a = Counter(list(hand))
    for i in a:
        if a[i] > 0:
            count = a[i]
            for j in range(W):
                a[i + j] -= count
                if a[i + j] < 0:
                    return False
    return True

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 13:57:12 | 显示全部楼层
“每个组的大小都是 W”是什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 13:57:13 | 显示全部楼层
本帖最后由 风魔孤行者 于 2020-3-14 14:01 编辑

不知道我对这个题目理解得对不对
def f(list1,w):
    if w*w != len(list1):
        return False
    else:
        list1.sort()
        for each in range(w):
            a = list1.pop(0)
            try:
                list1.remove(a+1)
                list1.remove(a+2)
            except ValueError:
                return False
        return True

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 13:57:13 | 显示全部楼层
本帖最后由 flamezyy 于 2020-3-14 14:24 编辑
def f351(hand,W):
    length = len(hand)
    if length % W:
        return False
    else:
        hand.sort()
        while(hand):
            begin_num = hand[0]
            del hand[0]
            try:
                i = 0
                while(i < W-1):
                    i += 1
                    hand.remove(begin_num+i)
            except ValueError:
                return False
        else:
            return True
参考楼上的异常处理机制改了下

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 14:04:15 From FishC Mobile | 显示全部楼层
里面的大小应该理解为长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 14:04:18 | 显示全部楼层
本帖最后由 TJBEST 于 2020-3-14 16:16 编辑

我还是那个建议,函数传进的参数是数组,最好是在额外的容器中处理数据,不要在原始的数组上操作。
def fun351(hand,W):
    M = len(hand)
    if W == 1:
        return True
    if M % W != 0:
        return False
    if (2*sum(hand)) % W!=0:
        return False
    div = M // W
    sorted_arr = sorted(hand)
    for i in range(0,div):
        maxNum  = sorted_arr[-1]
        for index in  range(0,W):
            try:
                position = sorted_arr.index(maxNum-index)
                del sorted_arr[position]
            except Exception:
                return False
    return True

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 14:14:58 | 显示全部楼层
本帖最后由 kinkon 于 2020-3-14 20:17 编辑

如果没有bug,速度应该不错的,O(n)楼主试试
hands = sorted(hand)    
    l = len(hands)
    if l % w: return False
    if w == 1 and l > 0:return True
    for i in range(1, l):
        s = hands[i-1] + 1
        if hands[i] == s or (i+1) % w == 1:
            continue                        
        else:
            try:
               t = hands[i:].index(s)
               hands.insert(i, hands.pop(t+i))          
            except:            
               return False
        
    return True 

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 14:27:18 | 显示全部楼层
每个组的大小W是不是说要分成W个组?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 14:35:14 | 显示全部楼层
fan1993423 发表于 2020-3-14 14:27
每个组的大小W是不是说要分成W个组?

现在她想把牌重新排列成组,使得每个组的大小都是 W,且由 W 张连续的牌组成
应该是每个组的元素个数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 15:32:19 | 显示全部楼层
时间有限,先提交吧,有可能超时了...
def f351(hand, w):
    hand.sort()    
    l = len(hand)
    if l % w: return False
    res, tmp = [], []
    while len(hand):
        m = hand.pop(0)
        tmp.append(m)                              
        while len(tmp) !=  w:
            try: 
                idex = m + 1 
                t = hand.index(idex)
                m = hand.pop(t)
                tmp.append(m)
            except:            
                return False
        if len(tmp) == w:
            res.append(tmp)
            tmp = []
    return True

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 15:36:31 | 显示全部楼层
本帖最后由 fan1993423 于 2020-3-14 15:51 编辑
def fun351(hand,W):
    Min=min(hand)
    if len(hand)%W:return False
    if W==1:return True
    while hand:
        try:
            for i in range(Min,Min+W):
                hand.remove(i)
            if not len(hand):return True
            Min=min(hand)
        except:
            return False
我想了半天,目前只想到删元素这个一开始就有的想法,我个人觉得有更好的办法,看其他鱼油的发挥吧

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 15:58:17 | 显示全部楼层
a = [1, 2, 3, 6, 2, 3, 4, 7, 8]
W = 3
b = list(set(a))
c = list(map(lambda x: [x, a.count(x)], b))
if len(a) % W == 0:
    while True:
        if b == []:
            print("True")
            break
        elif len(b) < W:
            print("False")
            break
        elif b[W - 1] - b[0] == W - 1:
            for i in range(W - 1, -1, -1):
                c[i][1] -= c[0][1]
            for each in c[:W]:
                if each[1] == 0:
                    c.remove(each)
                    b.remove(each[0])
        else:
            print("False")
            break
else:
    print("False")
小白又来了!

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 16:56:26 | 显示全部楼层
def func351(hand,w):
    if len(hand)%w:
        return False
    hand.sort()
    for i in range(len(hand)//3):
        maxnumber = max(hand)
        hand.remove(maxnumber)
        try:
            hand.remove(maxnumber-1)
            hand.remove(maxnumber-2)
        except ValueError:
            return False
    return True

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-3-14 17:31:22 | 显示全部楼层
ouyunfu 发表于 2020-3-14 13:57
“每个组的大小都是 W”是什么意思?

每个组的元素个数都是 W
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 17:32:37 | 显示全部楼层
风魔孤行者 发表于 2020-3-14 13:57
不知道我对这个题目理解得对不对

解答错误

输入:hand = [1, 2, 3, 4, 5, 6], W = 2
输出:False
预期结果:True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 17:32:56 | 显示全部楼层
flamezyy 发表于 2020-3-14 13:57
参考楼上的异常处理机制改了下

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

使用道具 举报

 楼主| 发表于 2020-3-14 17:34:17 | 显示全部楼层
TJBEST 发表于 2020-3-14 14:04
我还是那个建议,函数传进的参数是数组,最好是在额外的容器中处理数据,不要在原始的数组上操作。
{:5_10 ...

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

使用道具 举报

 楼主| 发表于 2020-3-14 17:34:54 | 显示全部楼层
kinkon 发表于 2020-3-14 15:32
时间有限,先提交吧,有可能超时了...

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

使用道具 举报

 楼主| 发表于 2020-3-14 17:35:34 | 显示全部楼层
fan1993423 发表于 2020-3-14 15:36
我想了半天,目前只想到删元素这个一开始就有的想法,我个人觉得有更好的办法,看其他鱼油的发挥吧

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 00:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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