鱼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 编辑
  1. def f344(A:int,B:int)->str:
  2.     if abs(A-B)>min(A,B)+2:
  3.         return 'no answer!'
  4.     else:
  5.         if A==B:
  6.             return 'ab'*A
  7.         if A>B:
  8.             for m in range(int((A+B)/3)+1):
  9.                 for n in range(int((A+B)/2)+1):
  10.                     for k in range(3):
  11.                         if len(m*'aab'+n*'ab'+k*'a')==A+B:
  12.                             return m*'aab'+n*'ab'+k*'a'
  13.         else:
  14.             for m in range(int((A+B)/3)+1):
  15.                 for n in range(int((A+B)/2)+1):
  16.                     for k in range(3):
  17.                         if len(m*'bba'+n*'ba'+k*'b')==A+B:
  18.                             return m*'bba'+n*'ba'+k*'b'

  19.         

  20. print(f344(1,2))
  21. print(f344(4,1))
复制代码

评分

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

查看全部评分

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

使用道具 举报

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


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

使用道具 举报

发表于 2020-3-5 22:19:10 From FishC Mobile | 显示全部楼层
  1. def get(a,b,n,m):
  2.     str1 = ''
  3.     for i in range(1,n+m+1):
  4.         if i%3:str1+=a
  5.         else:
  6.             str1+=b
  7.     k = m-str1.count(b)
  8.     return str1.replace(a+b,b+b,k)
  9. def fun344():
  10.     g = input('A B:').split(' ')
  11.     a,b = int(g[0]),int(g[1])
  12.     if a>b:
  13.         str1=get('a','b',a,b)
  14.     else:
  15.         str1=get('b','a',b,a)
  16.     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 | 显示全部楼层
  1. def f344(a, b):
  2.     if a > b:
  3.         res = ['a','b']*b
  4.         for i in range(a - b):
  5.             res.insert(i*3, 'a')
  6.     else:
  7.         res = ['b','a']*a
  8.         for i in range(b - a):
  9.             res.insert(i*3, 'b')
  10.     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 | 显示全部楼层
没有关于做不到要求的处理。如果数据不符合要求,会无限循环。
  1. def solve(A:int,B:int)->str:
  2.     res = ''
  3.     while 1:
  4.         if A >= B:
  5.             if A >= 2:res += 'aa';A -= 2
  6.             elif A and res[-2:] != 'aa':res += 'a';A -= 1
  7.             if B >= 2:res += 'bb';B -= 2
  8.             elif B and res[-2:] != 'bb':res += 'b';B -= 1
  9.         elif B > A:
  10.             if B >= 2:res += 'bb';B -= 2
  11.             elif B and res[-2:] != 'bb':res += 'b';B -= 1
  12.             if A >= 2:res += 'aa';A -= 2
  13.             elif A and res[-2:] != 'aa':res += 'a';A -= 1
  14.         elif A and not B:res = res.replace('bb','bab',1);A -= 1
  15.         elif B and not A:res = res.replace('aa','aba',1);B -= 1
  16.         if not(A or B):return res
  17. if __name__ == '__main__':
  18.     print('示例1 输出:',repr(solve(1,2)))
  19.     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 | 显示全部楼层
  1. def fun344(na, nb):
  2.     mx = max(na, nb)
  3.     mi = min(na, nb)

  4.     if mx > mi * 2 + 2:
  5.         return None
  6.     else:
  7.         ls1 = list('ab' * mi)
  8.         if mx - mi * 2 <= 0:
  9.             for i in range(mx - mi):
  10.                 ls1[i*2]+='a'
  11.         else:
  12.             for i in range(mi):
  13.                 ls1[i*2]+='a'
  14.             ls1.append('a' * (mx - mi * 2))

  15.         s1 = ''.join(ls1)
  16.         if nb > na:
  17.             s1 = s1.replace('a', 'x')
  18.             s1 = s1.replace('b', 'a')
  19.             s1 = s1.replace('x', 'b')
  20.             
  21.         return s1
  22.    

  23. 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 编辑

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

评分

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

查看全部评分

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

使用道具 举报

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


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

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


  12. print(f_344(6, 3))
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-25 15:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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