在c#中只打印一次重复的数字

本文关键字:一次 数字 打印 | 更新日期: 2023-09-27 18:09:25

我有一个包含"n"个数字的数组,我需要只打印一次所有重复的数字

我做了这个代码,但是出了问题

for (int i = 0; i < numbers.Length; i++)
            {
                for (int j = 1; j < numbers.Length; j++)
                {
                    if (numbers[i] == numbers[j] && i!=j)
                    {
                        Console.WriteLine(numbers[i]);
                        break;
                    }
                }
            }

那么如果我的数组有元素{2,3,1,5,2,3}

程序打印:

2
3
3

我能做什么?

在c#中只打印一次重复的数字

您可以使用:

using System.Linq;
…
foreach(var number in numbers.Distinct()) Console.WriteLine(number);

编辑

我可能误解了这个要求。如果你只想输出多次出现的数字,那么你可以使用:

foreach(var group in numbers.GroupBy(n => n).Where(g => g.Count() > 1))
    Console.WriteLine(group.Key);
var query = numbers.GroupBy(x => x)
                   .Where(g => g.Skip(1).Any())
                   .Select(g => g.Key);
foreach (int n in query)
{
    Console.WriteLine(n);
}

或者,或者。。。

var dict = new Dictionary<int, int>();
foreach (int n in numbers)
{
    int count;
    dict.TryGetValue(n, out count);
    if (count == 1)
    {
        Console.WriteLine(n);
    }
    dict[n] = count + 1;
}

代码中的问题是:重复3,因为当i为1时(查看第一个3(,列表末尾还有另一个3,当i为5时(查看最后一个3(,列表中靠近开头还有另外三个。

相反,你应该只看那些在你当前位置之后的数字——改为int j = i;,这样你就只看你当前位置后面的位置,你就不会得到重复的结果。

for (int i = 0; i < numbers.Length; i++)
{
    for (int j = i; j < numbers.Length; j++)
    {
        if (numbers[i] == numbers[j] && i!=j)
        {
            Console.WriteLine(numbers[i]);
            break;
        }
    }
}

话虽如此,您的算法不如使用内置算法高效。尝试GroupBy

var duplicates = numbers.GroupBy(n => n)
    .Where(group => group.Count() > 1);
foreach (var group in duplicates)
{
    Console.WriteLine("{0} appears {1} times", group.Key, group.Count());
}

获取不同数字的一种方法是

var uniqueNumbers = numbers.Distinct().ToArray()

然后对uniqueNumbers进行迭代,就像您在代码段中使用数字一样。

您可以在循环时将数字添加到哈希集,然后仅在不在哈希集中时打印。

这可以让你一次完成。

上面的算法是n^2,应该避免。

// deletes an integer if it appears double
#include <iostream.h>
#include <conio.h>
int main ()
{
    int count=0;
   int ar[10]={1,2,3,3,3,4,5,6,7,7};
 for (int i=0; i<10; i++)
  {
                     if (ar[i]==ar[i+1])
                     count++;
                     else
                     cout << ar[i];

}
getch();
  return 0;
}