Печать повторных номеров только один раз в C # - PullRequest
2 голосов
/ 22 сентября 2011

У меня есть массив с "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

что я могу сделать?

Ответы [ 6 ]

1 голос
/ 22 сентября 2011

Проблема в вашем коде: вы получаете 3 повторения, потому что когда я равен 1 (смотря на первый 3), в конце есть еще 3 в списке, а когда мне 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());
}
1 голос
/ 22 сентября 2011
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;
}
1 голос
/ 22 сентября 2011

Вы можете использовать:

using System.Linq;

…

foreach(var number in numbers.Distinct()) Console.WriteLine(number);

edit

Возможно, я неправильно понял требование.Если вы хотите вывести числа, которые появляются более одного раза, вы можете использовать:

foreach(var group in numbers.GroupBy(n => n).Where(g => g.Count() > 1))
    Console.WriteLine(group.Key);
0 голосов
/ 08 апреля 2013
// 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;
}
0 голосов
/ 22 сентября 2011

Вы можете добавить номер в HashSet во время зацикливания, а затем печатать только в том случае, если не указан хеш-код.

Это позволяет вам сделать это за один проход.

Алгоритм выше n ^ 2, которого следует избегать.

0 голосов
/ 22 сентября 2011

Один из способов получить разные числа - это

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

, а затем выполнить итерацию по уникальным номерам, как у вас во фрагменте кода с номерами.

...