我的解决方案有什么问题?帮助我改进它或任何其他解决方案?

what is wrong in my solution? help me to impove it or any other solution?

一个教室有几个学生,一半是男生,一半是女生。早会需要将他们排成一排,满足以下条件:

同学们一定要按照身高不递减的顺序。 两个男孩或两个女孩不能相邻。 你已经得到数组中男孩的身高和数组中女孩的身高。看看你是否可以按满足给定条件的顺序排列它们。如果可能,打印 "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"

这是我的,只有 1 个测试用例失败,其中

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'

}

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

你写的条件是:

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

请注意,'?=' 是前瞻性的,这意味着只有当您有 2 个女孩之前有 2 个男孩或有 2 个男孩之前有 2 个女孩时,它才会给出 true。当字符串为 -> 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)
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"