我的解决方案有什么问题吗? 帮我把它或任何其他解决方案?

问题描述 投票:0回答:1

一个教室有几个学生,其中一半是男生,一半是女生。你需要将他们全部排成一队参加晨会,使之满足以下条件。

学生的身高必须按不递减的顺序排列.两个男生或两个女生不能相邻.你已经得到了排列中男生的身高和排列中女生的身高. 请找出你是否能将它们按满足给定条件的顺序排列。如果可以,请打印 "YES",如果不可以,请打印 "NO".这个是我的,但我在3个试题中得到了错误的答案.这里,a是男生高度的数组,b是女生的数组。

a=sorted(a)
b=sorted(b)
i=0
n=len(a)
j=0
x=""

while i<n and j<n:
    if a[i]<b[j]:
        x+="b"
        i+=1
    elif a[i]==b[j]:
        if len(x)==0:
            x+="b"
            i+=1
        elif x[-1]=="b":
            x+="g"
            j+=1
        else:
            x+="b"
            i+=1

    else:
        x+="g"
        j+=1

while i<n:
    x+="b"
    i+=1
while j<n:
    x+="g"
    j+=1

p=re.findall(r"[g]{2,}(?=[b]{2})",x)
q=re.findall(r"[b]{2,}(?=[g]{2})",x)
if q or p:
    return "NO"
else:
    return "YES"
coding-style
1个回答
0
投票

我看到了你的代码。所以错误在于你检查2个男孩和2个女孩的部分。

你写的条件是。

p=re.findall(r"[g]{2,}(?=[b]{2})",x)
q=re.findall(r"[b]{2,}(?=[g]{2})",x)

请注意,'?='是看前的,这意味着只有当你在两个男孩之前有两个女孩或者在两个女孩之前有两个男孩时,它才会给出真值。当情况是这样的,字符串出来是-> GBBG或BGGB或GBBGBG或BGGBGB时,这个逻辑就会失败。

我建议使用标志系统来代替,因为你只需要跟踪行中最后一个条目。让标志为'0'代表男孩,'1'代表女孩。

flag=2
success = "Yes";
while i<n and j<n:
    if(a[i]<b[j]):
        if(flag==2):
            flag = 0
        elif(flag == 0):
            success="No"
            break;
        else:
            flag=0
    elif(a[i]==b[j])
        if(flag==2):
            flag=0
        elif(flag==0):
            flag=1
        else:
            flag=0
    else:
        if(flag==2):
            flag=1
        elif(flag==1):
            success="No"
            break;
        else:
            flag=1

print(success)

0
投票

这是我的,它只在一个测试用例中失败,其中

a = [32, 2]
b = [28, 37]

解决办法:

function arrangeStudents(a, b) {
    const result = []

    let i = 0;
    let j = 0;

    while (i < a.length && j < b.length) {
        if (a[i] < b[j]) {
            if (i > 0 && j > 0 && a[i - 1] !== b[j - 1] && result[result.length - 1] == a[i - 1]) {
                return 'NO'
            }else if (j == 0 && i > 0 && result[result.length - 1] == a[i - 1]){
                return 'NO'
            }else {
                result.push(a[i])
            }
            i++
        }else if(a[i] > b[j]) {
            if (i > 0 && j > 0 && a[i - 1] !== b[j - 1] && result[result.length - 1] == b[j - 1]) {
                return 'NO'
            }else if (i == 0 && j > 0 && result[result.length - 1] == b[j - 1]){
                return 'NO'
            }else {
                result.push(b[j])
            }

            j++;
        }else {
            if (i > 0 && result[result.length - 1] == a[i -1]) {
                result.push(b[j], a[i])
            }else {
                result.push(a[i], b[j])
            }
            i++
            j++
        }
    }
    return 'YES'

}

0
投票
a=sorted(a)
b=sorted(b)
i=0
flag=0
n=len(a)
j=0
x=""

while i<n and j<n:
    if a[i]<b[j]:
        x+="b"
        i+=1
    elif a[i]==b[j]:
        if len(x)==0:
            x+="b"
            flag=1
            i+=1
        elif x[-1]=="b":
            x+="g"
            j+=1
        else:
            x+="b"
            i+=1

    else:
        x+="g"
        j+=1

while i<n:
    x+="b"
    i+=1
while j<n:
    x+="g"
    j+=1


w=re.findall(r"[b]{2}",x)
t=re.findall(r"[g]{2}",x)

if (w or t) and flag==1:
    i=0

    n=len(a)
    j=0
    x=""

    while i<n and j<n:

        if a[i]<b[j]:
            x+="b"
            i+=1
        elif a[i]==b[j]:
            if len(x)==0:
                x+="g"

                j+=1
            elif x[-1]=="b":
                x+="g"
                j+=1
            else:
                x+="b"
                i+=1

        else:
            x+="g"
            j+=1

    while i<n:
        x+="b"
        i+=1
    while j<n:
        x+="g"
        j+=1


    w=re.findall(r"[b]{2}",x)
    t=re.findall(r"[g]{2}",x)
    if w or t:
        return "NO"
    else:
        return 'YES'
elif w or t:
    return "NO"
else:
    return "YES"
© www.soinside.com 2019 - 2024. All rights reserved.