1
bool hasDuplicate = false;   
int[] a = new int[] {1, 2, 3, 4};
int[] b = new int[] { 5, 6, 1, 2, 7, 8 };

我需要将数组 A 的所有元素与数组 B 的元素进行比较,如果 B 中有重复元素,请将 hasDuplicate 设置为 TRUE。

4

11 回答 11

21
hasDuplicates = a.Intersect(b).Any();

您可以使用 LINQIntersect方法 - http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx

于 2012-06-15T14:03:38.783 回答
5

我知道您不想要单线解决方案,但我会将我的答案留给其他可能想要针对同一问题的简单解决方案的用户。

如果您不想使用Linq,可以使用SequenceEqual

bool equal = Array1.SequenceEqual(Array2);

希望能帮助到你。

于 2012-06-15T14:04:13.520 回答
5

不是性能最高但可能最容易理解的方法是这样的:

foreach (int _a in a) { // iterate through all elements in array a (as _a)
    foreach (int _b in b) { // iterate through all elements in array b (as _b)
        if (_a == _b) { // if we've got a duplicate
            hasDuplicates = true; // store that for later on
            break; // immediately leave this loop (no point in further looking up)
        }
    }
    if (hasDuplicates) { // if we've got a duplicate
        break; // leave this loop as well (no point in further looking up)
    }
}

显然,这不是最高效的解决方案,因为复杂性是O(n²),这意味着任何一个数组中元素数量的两倍将使完成操作所需的时间加倍(最坏情况);两个数组中元素数量的两倍将使时间量增加四倍。

更优雅的解决方案是使用其他一些解决方案中描述的预定义方法,但由于这是家庭作业,我不希望您被允许使用这些“快捷方式”(或应该这样做)。

永远记住:即使你在这里找到了解决方案,也要试着去理解它们,用它们来获得灵感,然后自己写。这可能是最好的学习方式。不要只是复制和粘贴。

于 2012-06-15T14:10:43.807 回答
5

既然这是作业,我会给你一个作业的答案。

当然,您可以使用 LINQ 并依赖SequenceEqual,Intersect等,但这可能不是练习的重点。

给定两个数组,您可以使用foreach.

int[] someArray;
foreach(int number in someArray)
{
     //number is the current item in the loop
}

因此,如果您有两个相当小的数组,您可以遍历第一个数组的每个数字,然后遍历第二个数组中的所有项目并进行比较。让我们试试看。首先,我们需要更正您的数组语法。它应该看起来像这样:

    int[] a = new int[] {1, 2, 3, 4};
    int[] b = new int[] { 5, 6, 1, 2, 7, 8 };

注意花括号的使用{。您正在使用该语法创建一个 N 维数组。

bool hasDuplicate = false;
int[] a = new int[] { 1, 2, 3, 4 };
int[] b = new int[] { 5, 6, 7, 8 };
foreach (var numberA in a)
{
    foreach (var numberB in b)
    {
        //Something goes here
    }
}

这让我们非常接近。我鼓励你从这里自己尝试。如果您仍然需要帮助,请继续阅读。


好的,所以我们基本上只需要检查数字是否相同。如果是,则设置hasDuplicate为 true。

bool hasDuplicate = false;
int[] a = new int[] { 8, 1, 2, 3, 4 };
int[] b = new int[] { 5, 6, 7, 8 };
foreach (var numberA in a)
{
    foreach (var numberB in b)
    {
        if (numberA == numberB)
        {
            hasDuplicate = true;
        }
    }
}

这是一种非常“蛮力”的方法。循环的复杂性是 O(n 2 ),但这在你的情况下可能无关紧要。使用 LINQ 的其他答案肯定更有效,如果效率很重要,您可以考虑这些。break另一种选择是使用if为 true来“停止”循环hasDuplicate,或者将此代码放在一个方法中并用于return退出该方法。

于 2012-06-15T14:21:00.317 回答
4

如果学习是您所寻求的,而算法是您试图提出的,那么使用 LINQ 和任何其他爵士乐都对您没有帮助。

您需要有 2 个嵌套foreach(或for,无论您喜欢哪个)循环,一旦您在第一个循环中找到一个与第二个循环中的成员匹配的成员,将您的布尔变量设置为 true 和break循环

于 2012-06-15T14:09:18.527 回答
4

尽管LINQ可以用一行代码帮助您做到这一点,但最好理解它是如何工作的,因为您在问题中提到了算法这个词:)

遍历数组并将每个项目与第二个数组中的项目进行比较。如果存在,则返回 true。否则为假。我会把它包装在这样的函数中

public bool IsPresentInArray(int[] firstArray, int[] secondArray)
{
    foreach (var itemA in firstArray)
    {
        foreach (var itemB in secondArray)
        {
            if (itemB == itemA)
            {                       
                return true;
            }
        }
    }
    return false;
}

现在我可以这样称呼它

int[] a = new int[]{1, 2, 3, 4};
int[] b = new int[] { 5, 6, 1, 2, 7, 8};

bool present= IsPresentInArray(a, b);

在此处阅读有关 foreach 循环的信息

于 2012-06-15T14:15:26.493 回答
2

为了有效地将一组元素中的所有元素与另一组元素进行比较,您可以制作其中一个元素HashSet。此外,您可以在找到第一个匹配项后立即退出循环:

HashSet<int> h = new HashSet<int>(a);
foreach (int i in b) {
  if (h.Contains(i)) {
    hasDuplicate = true;
    break;
  }
}

这是一个 O(n+m) 解决方案,相比之下,有两个嵌套循环比较所有值,这是一个 O(n*m) 解决方案。

于 2012-06-15T14:33:35.167 回答
1

我们为什么不尝试使用 LINQ?看看下面的代码,

public bool Checking()
    {
        bool hasDuplicate = false;
        int[] a = new int[] { 1, 2, 3, 4 };
        int[] b = new int[] { 5, 6, 1, 2, 7, 8 };

        int count = a.Intersect(b).Count();
        if (count >= 1)
            hasDuplicate = true;

        return hasDuplicate;

    }
于 2015-05-31T15:16:29.870 回答
0

我使用“IndexOf”和“foreach”循环来创建它。(注意:前 3 行“字符串”只是说明如何创建数组并将其转换为正确格式的示例)。

如果要比较 2 个数组,它们将以分号分隔,但最后一个值后面不会有一个。如果在数组的字符串形式后附加分号(即 a;b;c 变为 a;b;c;),则可以使用“x;”进行匹配 不管它在什么位置:

bool found = false;
string someString = "a-b-c";
string[] arrString = someString.Split('-');
string myStringArray = arrString.ToString() + ";";

foreach (string s in otherArray)
{
    if (myStringArray.IndexOf(s + ";") != -1) {
       found = true;
       break;
    }
}

if (found == true) { 
    // ....
} 
于 2014-01-04T04:58:52.137 回答
0

我用for循环做到了。关键是我们将每个成员与 array 中的成员进行比较b。So首先a[0]与数组中的每个成员进行比较b,然后它会a[1]执行相同的操作,依此类推,直到找到匹配项。

bool hasDuplicate = false;

int[] a = new int[] { 1, 2, 3, 4 };
int[] b = new int[] { 5, 6, 1, 2, 7, 8 };

for (int i = 0; i < a.Length; i++)
{
    for (int j = 0; j < b.Length; j++)
    {
        if (a[i] == b[j])
        {
            hasDuplicate = true;
        }
    }
}
于 2015-12-22T11:51:52.003 回答
0

你应该对你的数据进行排序,O(nlog n),然后你可以简单地通过它们中的每一个,O(n),在那里你增加它们中的最低值。注意两次具有相同数字的数据,例如:

a = {1 3 3 5 8}

b = {2 3 5 5 8}

于 2018-12-13T21:38:25.983 回答