Дубликаты чисел в массиве [дубликаты]

0

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

Вот мой код.

#include <stdio.h>
int main()
{
    int n,i;
    int a[10]={2,2,2,4,6,6,9,10,10,11};
    printf("%d\n",a[10]);
    for(i=0;i<10;++i)
    {
        if(a[i]==a[i+1] && a[i]!=a[i-1])
            printf("%d ",a[i]);
        else
            continue;
    }
    return 0;
}

Код, кажется, работает нормально, но мне не нравится мой код, потому что в какой-то момент цикл сравнивает значение [0] с [-1] и [9] с [10], и оба эти, [-1] и [10] - значения мусора. Я уверен, что есть лучшие способы сделать это, но я не могу ни о чем думать.

Кроме того, мне нужно расширить вышеуказанную программу, чтобы подсчитать частоту повторяющихся чисел.

Помощь приветствуется. Благодарю!

Теги:
arrays
for-loop
loops

6 ответов

2
Лучший ответ

Во-первых, вы не можете получить доступ к [10] в своей строке printf, это вне вашего массива.

Это должно работать нормально.

#include <stdio.h>
int main()
{
    int n,i;
    int a[10]={2,2,2,4,6,6,9,10,10,11};
    for(i=0; i < 9; ++i)
    {
        if(a[i] == a[i+1])
            if(i > 0 && a[i] == a[i-1])
                continue;
            else
                printf("%d ",a[i]);
    }
    return 0;
}

Изменение: или вы можете использовать более короткие, но более сложные для чтения:

for(i=0; i < 9; ++i)
{
    if(a[i] == a[i+1] && (!i || a[i] != a[i-1]))
        printf("%d ",a[i]);
}
  • 0
    Здорово! Спасибо Халед!
  • 0
    Наиболее желанный :)
Показать ещё 1 комментарий
1

См. Код ниже для решения, которое будет печатать только повторяющиеся числа из массива и сколько раз они происходят.

Я добавил int c, который используется для вашего подсчета. Первоначально он установлен в 1 и увеличивается на 1 для каждого повторяющегося числа.

#include <stdio.h>
using namespace std;

int main() {

  int n,i,c;
  int a[10]={2,2,2,4,6,6,9,10,10,11};
  c = 1;
  for(i=0; i < 9; ++i)
  {
    if (a[i] == a[i+1]) {
    n = a[i];
    c += 1;
    } else {
        if (c > 1) {
        printf("Number: %d, Occurences: %d \n",n,c);
        c = 1;
        }
    }
  }
  return 0;
}
  • 0
    Это мило, спасибо! :)
0
#include <stdio.h>

int main(){
    int i, a[10]={2,2,2,4,6,6,9,10,10,11};
    int size = 10;

    for(i=0;i<size;++i){
        int tmp = a[i];
        int c = 1;
        while(++i < size && tmp == a[i])
            ++c;
        if(c > 1)
            printf("%d times %d\n", tmp, c);
        --i;
    }
    return 0;
}
0

Вы можете использовать функтор, оператор перегрузки() и вернуть набор (уникальные значения). Предполагая, что ваш массив отсортирован, это просто вопрос сравнения предыдущего со следующим и вставка его в набор, если они равны. Если они не отсортированы, вам нужно пройти весь массив для каждой записи. Ниже приводятся два примера с выводами в качестве объяснения.

#include <set>
using namespace std;

Unsorted array:

struct UnsortedArrayDuplicateEntries {
    set<int> operator()(int* array, int size) {
        set<int> duplicates;
        for (int i = 0; i < size - 1; i++)
            for (int j = i + 1;j < size; j++)
                if (array[i] == array[j]) 
                    duplicates.insert(array[j]);

        return duplicates;
    }
};

Сортированный массив:

struct SortedArrayDuplicateEntries {
    set<int> operator()(int* array, int size) {
        set<int> duplicates;
        for (int i = 0; i < size - 1; i++)
            if (array[i] == array[i+1]) 
                duplicates.insert(array[j]);

        return duplicates;
    }
};

Сортировка теста:

SortedArrayDuplicateEntries d;
int sorted[10]={2,2,2,4,6,6,9,10,10,11};
set<int> resultSorted = d(sorted,10);
for (int i : resultSorted) cout << i << endl;

Выбранный результат:

2
6
10

Тест несортирован:

UnsortedArrayDuplicateEntries d;
int unsorted[10]={2,6,4,2,10,2,9,6,10,11};
set<int> resultUnsorted = d(unsorted,10);
for (int i : resultUnsorted) cout << i << endl;

Выходные данные несортированы:

2
6
10

Я надеюсь, что это помогает!

0

Поскольку массив уже отсортирован, было бы легче сделать что-то подобное, с другим циклом внутри цикла for.

int duplicateCount = 1; // Must be at least one instance of a value in the array
for(int i = 0; i < 9; ++i) {
    int j = i;
    while(j != 9 && a[j] == a[j + 1]) {
        ++j;
        ++duplicateCount;
    }
    i = j; // j is now at end of list of duplicates, so put i at the end as well,
           // to be incremented to the next unique value at end of for loop iteration
    printf("%d: %d\n", a[j], duplicateCount);
    duplicateCount = 1; // Reset for next values
}

Если вы хотите подсчитать частоту всех чисел, вы можете легко превратить duplicateCount в массив значений, чтобы подсчитать частоту каждого уникального значения. Для лучшего решения вы можете использовать другую структуру данных, такую как карта.

0

Вам действительно нужно иметь два индекса, которые проходят через ваш массив. Здесь начинается:

int i = 0;
int j;

while (i < 10) {
    for (j = i+1; j < 10; ++j) if (a[i] != a[j]) break;
    if (j !+ i+i) printf("%d\n", a[i]);
    i = j;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню