鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

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

[复制链接]
发表于 2020-3-5 21:14:11 | 显示全部楼层
蒋博文 发表于 2020-3-5 21:12
我觉得会超时。。。。
但是人还是要尝试对吧

对了,@zltzlt 请问我用的x,y没事吧,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 21:17:35 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-3-5 21:39 编辑
def f344(A:int,B:int)->str:
    if abs(A-B)>min(A,B)+2:
        return 'no answer!'
    else:
        if A==B:
            return 'ab'*A
        if A>B:
            for m in range(int((A+B)/3)+1):
                for n in range(int((A+B)/2)+1):
                    for k in range(3):
                        if len(m*'aab'+n*'ab'+k*'a')==A+B:
                            return m*'aab'+n*'ab'+k*'a'
        else:
            for m in range(int((A+B)/3)+1):
                for n in range(int((A+B)/2)+1):
                    for k in range(3):
                        if len(m*'bba'+n*'ba'+k*'b')==A+B:
                            return m*'bba'+n*'ba'+k*'b'

        

print(f344(1,2))
print(f344(4,1))

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-5 21:24:55 | 显示全部楼层


你这方法不错,改我代码去
else:
      return '拼个锤子'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 22:19:10 From FishC Mobile | 显示全部楼层
def get(a,b,n,m):
    str1 = ''
    for i in range(1,n+m+1):
        if i%3:str1+=a
        else:
            str1+=b
    k = m-str1.count(b)
    return str1.replace(a+b,b+b,k)
def fun344():
    g = input('A B:').split(' ')
    a,b = int(g[0]),int(g[1])
    if a>b:
        str1=get('a','b',a,b)
    else:
        str1=get('b','a',b,a)
    print(str1)

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-5 22:52:09 From FishC Mobile | 显示全部楼层
先比较AB大小。比如A=5,b=3,
先生成ababab,
然后插入剩余2个a,就是aabaabab
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 23:14:03 | 显示全部楼层
def f344(a, b):
    if a > b:
        res = ['a','b']*b
        for i in range(a - b):
            res.insert(i*3, 'a')
    else:
        res = ['b','a']*a
        for i in range(b - a):
            res.insert(i*3, 'b')
    return ''.join(res)

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-5 23:58:35 From FishC Mobile | 显示全部楼层
先占楼,明天传代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 00:28:39 | 显示全部楼层
如果题目是,将A个‘a’和B个‘b’能组成的所有组合汇集成一个列表,那得怎么写代码。我想了一晚上没想出来,难受死我了,求楼主解答。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 01:42:09 | 显示全部楼层
1

评分

参与人数 2荣誉 -2 鱼币 -2 收起 理由
蒋博文 -1 -1 请不要无意义灌水!
wuqramy -1 -1 请不要无意义灌水!

查看全部评分

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

使用道具 举报

发表于 2020-3-6 09:36:24 | 显示全部楼层

楼主的意思应该是保证输入是有解的,意思就是测试数据里不会出现a=200 b=2 这种无解情况。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 10:24:49 | 显示全部楼层
没有关于做不到要求的处理。如果数据不符合要求,会无限循环。
def solve(A:int,B:int)->str:
    res = ''
    while 1:
        if A >= B:
            if A >= 2:res += 'aa';A -= 2
            elif A and res[-2:] != 'aa':res += 'a';A -= 1
            if B >= 2:res += 'bb';B -= 2
            elif B and res[-2:] != 'bb':res += 'b';B -= 1
        elif B > A:
            if B >= 2:res += 'bb';B -= 2
            elif B and res[-2:] != 'bb':res += 'b';B -= 1
            if A >= 2:res += 'aa';A -= 2
            elif A and res[-2:] != 'aa':res += 'a';A -= 1
        elif A and not B:res = res.replace('bb','bab',1);A -= 1
        elif B and not A:res = res.replace('aa','aba',1);B -= 1
        if not(A or B):return res
if __name__ == '__main__':
    print('示例1 输出:',repr(solve(1,2)))
    print('示例2 输出:',repr(solve(4,1)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 10:49:52 | 显示全部楼层
SHRS23 发表于 2020-3-5 20:14
麻烦版主帮忙测试

解答错误

输入:a = 1, b = 2
输出:"aab"
预期结果:"abb"(或其他符合条件的字符串)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 10:51:21 | 显示全部楼层
Unicorn# 发表于 2020-3-5 20:21
很久没答啦哈哈哈,准备高考了
版主都换头像啦
考虑无解(害怕)

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

使用道具 举报

发表于 2020-3-6 10:52:18 | 显示全部楼层
def fun344(na, nb):
    mx = max(na, nb)
    mi = min(na, nb)

    if mx > mi * 2 + 2:
        return None
    else:
        ls1 = list('ab' * mi)
        if mx - mi * 2 <= 0:
            for i in range(mx - mi):
                ls1[i*2]+='a'
        else:
            for i in range(mi):
                ls1[i*2]+='a'
            ls1.append('a' * (mx - mi * 2))

        s1 = ''.join(ls1)
        if nb > na:
            s1 = s1.replace('a', 'x')
            s1 = s1.replace('b', 'a')
            s1 = s1.replace('x', 'b')
            
        return s1
    

print(fun344(10, 18))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 10:58:57 | 显示全部楼层
楼主,能不能测试一下我的代码?谢谢
20楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 11:22:55 | 显示全部楼层
number1 = int(input('A='))
number2 = int(input('B='))
str1 = ''
while not(number1 == 0 and number2 == 0):
    a = 0
    b = 0
    if number1 >= number2:
        for i in range(number1):
            str1 += 'a'
            a += 1
            if a == 2:
                break
        number1 -= a
        if number1 >=number2:
            for j in range(number2):
                str1 += 'b'
                b += 1
                break
            number2 -= b
    else:
        for j in range(number2):
            str1 += 'b'
            b += 1
            if b == 2:
                break
        number2 -= b
        if number2 >= number1:
            for i in range(number1):
                str1 += 'a'
                a += 1
                break
            number1 -= a
print('输出:%s'%str1)

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-6 11:35:20 | 显示全部楼层
zltzlt 发表于 2020-3-6 10:49
解答错误

输入:a = 1, b = 2

2020-03-06_113347.png

这是什么情况呢。我这里是对的
VScode + Python3.8.1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 11:39:30 | 显示全部楼层
楼主麻烦测试一下咱的代码。26楼,辛苦啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 14:47:13 | 显示全部楼层
本帖最后由 kinkon 于 2020-3-6 14:49 编辑

前面借用塔利班的数字交换,减少代码行数,也曾想过用列表字符交换的方式,感觉会比较慢没往下编
def f344(A, B):
    a, b = 'a', 'b'
    if B > A:
        A, B = B, A
        a, b = b, a
    if (A - 1)//2 <= B: 
        if (2 * B - A) >= 0:
            s = (a + b) * (2 * B - A) + (a + a + b) * (A - B)
        else:
            s = (a + a + b) * B + a * (A - 2 * B)       
        return s
    else:
        return '此题无解'

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-6 15:35:54 | 显示全部楼层
本帖最后由 Geoffreylee 于 2020-3-6 17:58 编辑
import itertools as it


def f_344(a: int, b: int) -> list:
    max_num, min_num = max(a, b), min(a, b)  # 较大值除以较小值+1大于2,此题无解
    if max_num / (min_num+1) > 2:
        return 'No solution'

    else:
        string = 'a' * a + 'b' * b
        # 找出字符串所有排列组合
        string_list = [''.join(i) for i in set(it.permutations(string, len(string)))]
        # 过滤包含'aaa'和'bbb'的字符串
        return list(filter(lambda x: not('aaa' in x or 'bbb' in x), string_list))


print(f_344(6, 3))

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 12:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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