如何有效地编码来检查具有相同元素数量的两个数组是否具有相同的元素,即使位置不同?

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

我试图解决这个问题:给定一个数字 N 和两个包含 N 个元素的 A、B 数组,确定 B 是否包含与 A 相同的元素(不一定位于相同位置)。

将有三个输入:

  • 第一行包含 N 个元素

  • 第二行包含数组A的N个元素

  • 第三行包含数组 B 的 N 个元素

示例:

输入:

4
4 2 3 7
2 3 4 9

输出:

no

输入:

5
5 1 1 9 3
1 9 1 5 3

输出:

yes

我的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    scanf("%d", &n);
    long int a[n], b[n];
    for (int i = 0; i < n; i++)
    {
        scanf("%ld", &a[i]);
    }
    for (int i = 0; i < n; i++)
    {
        scanf("%ld", &b[i]);
    }
    
    int same;
    for (int j = 0; j < n; j++)
    {
        same = 0;
        for (int k = 0; k < n; k++)
        {
            if (a[j] == b[k])
            {
                same = 1;
            }
        }
        if (same == 0)
        {
            break;
        }
    }
    if (same == 0)
    {
        printf("no\n");
    }
    else
    {
        printf("yes\n");
    }
    return 0;
}

我的代码将获取数组 A 的第一个元素并将其与数组 B 的所有元素进行比较,然后获取 A 的后续元素并执行相同的操作。这种方法可以成功地为前 3 个测试用例提供正确的输出(问题中仅显示了 2 个),但它在测试 4 上显示了错误的答案,我不知道为什么,因为未显示该测试用例的输入。所以,请帮我找出代码中的问题。

arrays c permutation array-comparison
1个回答
0
投票

如果数组具有相同的数字但数量不同,则您的方法不起作用:例如:

1 1 2
1 2 2
将产生
yes
,即使数组并不严格包含不同顺序的相同数字。

更可靠的方法是复制两个数组,对它们进行排序并比较排序后的数组。

© www.soinside.com 2019 - 2024. All rights reserved.