鱼C论坛

 找回密码
 立即注册
查看: 4314|回复: 78

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

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

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

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

x
今天的题目:


给定两个整数 A 和 B,返回任意字符串 S,要求满足:

  • S 的长度为 A + B,且正好包含 A 个 'a' 字母与 B 个 'b' 字母;
  • 子串 'aaa' 没有出现在 S 中;
  • 子串 'bbb' 没有出现在 S 中。


示例 1:

输入:A = 1, B = 2
输出:"abb"
解释:"abb", "bab" 和 "bba" 都是正确答案。
示例 2:

输入:A = 4, B = 1
输出:"aabaa"


欢迎大家一起答题!
最佳答案
2020-3-5 21:12:27
我觉得会超时。。。。
但是人还是要尝试对吧
def fun344(x,y):
    a = 'a'
    b = 'b'
    if x < y:
        x,y = y,x
        a,b = b,a
    z = min(x - y, y)
    if z == 0:
        return (a + b) * y
    result = (2 * a + b) * z
    if z == y:
        n = x - 2 * y
        result += n * a
        return result
    else:
        result += (a + b) * (2 * y - x)
        return result


本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-3-5 19:44:57 | 显示全部楼层
不高亮吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 19:48:23 | 显示全部楼层
子串 'aaa' 没有出现在 S 中;
子串 'bbb' 没有出现在 S 中。

意思是不允许连续三个一样的字母出现,对吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 19:49:25 | 显示全部楼层
题目有问题,有可能无解,比如A=15,B=2.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-5 19:56:01 From FishC Mobile | 显示全部楼层
fan1993423 发表于 2020-3-5 19:49
题目有问题,有可能无解,比如A=15,B=2.

保证不存在无解的情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-5 19:56:40 From FishC Mobile | 显示全部楼层
SHRS23 发表于 2020-3-5 19:48
子串 'aaa' 没有出现在 S 中;
子串 'bbb' 没有出现在 S 中。


是的,而且字符串中仅包含 a 和 b 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 20:01:55 | 显示全部楼层
fan1993423 发表于 2020-3-5 19:49
题目有问题,有可能无解,比如A=15,B=2.

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

使用道具 举报

发表于 2020-3-5 20:04:32 | 显示全部楼层

请看清楚题意再来回答,ok?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 20:09:23 | 显示全部楼层
这道题还可以在难点,比如问有几种可能性。就更难了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 20:14:00 | 显示全部楼层
本帖最后由 SHRS23 于 2020-3-6 09:46 编辑
""" 
给定两个整数 A 和 B,返回任意字符串 S,要求满足:
S 的长度为 A + B,且正好包含 A 个 'a' 字母与 B 个 'b' 字母;
子串 'aaa' 没有出现在 S 中;
子串 'bbb' 没有出现在 S 中。 
"""
def generate_str(a, b):
    s = ''
    if a>b:
        devide_a_by_b = True
    else:
        a, b = b, a
        devide_a_by_b = False
    while b > 0 or a > 0:
            if a >= 2:
                if devide_a_by_b:
                    s += 'aa'
                else:
                    s += 'bb'
                a -= 2
            elif a == 1:
                if devide_a_by_b:
                    s += 'a'
                else:
                    s += 'b'
                a -= 1
            if b:
                if devide_a_by_b:
                    s += 'b'
                else:
                    s += 'a'
            b -= 1
    print(s)

def day344():
    a, b = map(int, input('Input A B: ').split())
    generate_str(a, b)

day344()

麻烦版主帮忙测试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 20:20:35 | 显示全部楼层
fan1993423 发表于 2020-3-5 20:04
请看清楚题意再来回答,ok?

刚才敲的代码全废了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 20:21:28 | 显示全部楼层
很久没答啦哈哈哈,准备高考了
版主都换头像啦
考虑无解(害怕)
def solve(a, b):
    if a == 0:
        return b*'b'
    if b == 0:
        return a*'a'
    if a > 2*b + 2 or b > 2*a + 2:
        return None
    else:
        if a > b:
            return 'aab'*(a-b)+'ab'*(2*b-a) if a <= 2*b else 'aab'*b+'a'*(a-2*b)
        else:
            return 'bba'*(b-a)+'ba'*(2*a-b) if b <= 2*a else 'bba'*a+'b'*(b-2*a)

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-5 20:23:34 | 显示全部楼层
一个答案就算对?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 20:25:16 | 显示全部楼层
因为是只用列出一种解,就简单许多了,楼主可以增加难度,问有几种可能性。
def fun344(A,B):
    difference=abs(A-B)
    if not difference:return 'ab'*A
    elif difference<=2:
        if A>B:return 'ab'*B+'a'*difference
        else:return 'ba'*A+'b'*difference
    else:
        new_diff=difference-2
        if A>B:return 'aab'*new_diff+'ab'*(B-new_diff)+'aa'
        else:return 'bba'*new_diff+'ba'*(A-new_diff)+'bb'

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-5 20:34:41 | 显示全部楼层
绝对超时。。。。
import random

def f344(A,B):
    list1=[]
    for i in range(A):
        list1.append("a")
    for i in range(B):
        list1.append("b")
    random.shuffle(list1)
    str1=creat_str(list1)

    while True:
        if "aaa" not in str1 and "bbb" not in str1:
            return str1
        else:
            random.shuffle(list1)
            str1 = creat_str(list1)

def creat_str(list1):
    str1=""
    for i in list1:
        str1+=i
    return str1

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-5 20:46:58 | 显示全部楼层
本帖最后由 塔利班 于 2020-3-5 21:21 编辑
def f344(A,B):
    a,b='a','b'
    if A>B:
        A,B=B,A
        a,b=b,a
    t=(B-1)//2
    if A>=t:
        if 2*t>=A:
            return (b+a+b+a)*(A-t)+(b+b+a)*(2*t-A)+b*(B-2*t)
        else:
            return (b+a)*A+b*(B-A)
    else:
        return '拼个锤子'

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-5 20:48:21 | 显示全部楼层
不知道符不符合题主的意思
def fun344(A,B):
    if A < B:
        big = 'b'
        small = 'a'
        num = A
    else:
        big = 'a'
        small = 'b'
        num = B
    List = [big for i in range(0,A+B)]
    L = (A+B)//3
    P = num - L
    for index in range(1,L+1):
        List[3*index-1] = small
    for index in range(1,P+1):
        List[3*index-2] = small
    result = ''
    for each in List:
        result += each
    return result

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-5 21:10:05 | 显示全部楼层
本帖最后由 wuqramy 于 2020-3-5 21:28 编辑

a = input('a = ')
b = input('b = ')
s = ''
num1 = int(a)
num2 = int(b)
counta = 0
countb = 0
for i in range(num1 + num2):
    if num1 != 0:
        s += 'a'
        counta += 1
        num1 -= 1
    if num1 == 0 and num2 != 0:
        s += 'b'
        countb += 1
        num2 -= 1
    if num1 != 0 and num2 != 0:
        if counta == 2:
            s += 'b'
            counta = 0
            num2 -= 1
        elif countb == 2:
            s += 'a'
            num1 -= 1
            countb = 0
    if counta > 2 or countb > 2:
        s = '此数据无法拼接!'
print(s)

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-5 21:11:50 | 显示全部楼层
真会无解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 21:12:27 | 显示全部楼层    本楼为最佳答案   
我觉得会超时。。。。
但是人还是要尝试对吧
def fun344(x,y):
    a = 'a'
    b = 'b'
    if x < y:
        x,y = y,x
        a,b = b,a
    z = min(x - y, y)
    if z == 0:
        return (a + b) * y
    result = (2 * a + b) * z
    if z == y:
        n = x - 2 * y
        result += n * a
        return result
    else:
        result += (a + b) * (2 * y - x)
        return result


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-17 11:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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