Как проверить наличие дубликатов массива в C - PullRequest
0 голосов
/ 04 февраля 2019

Цель моей программы на C состоит в том, чтобы взять два массива (оба состоят из уникальных чисел) и объединить их в новый массив, исключив любые числа, которые являются одинаковыми между ними.Однако, когда я пытаюсь объединить два, вместо этого он печатает обратно оба массива вместе, не удаляя дубликаты.

Моя программа создает «array_C», сначала добавляя элементы из «array_A».После этого он проверяет наличие дубликатов между «array_B» и «array_C» с помощью переменной счетчика.Для каждого значения в «array_C», которое проверяет цикл for, если значение «array_B» не равно значению в «array_C», счетчик уменьшается на 1. Если после проверки всех значений в «array_C»,counter = <0, это означает, что в «array_C» нет дубликатов этого значения, и его следует добавить в конец «array_C».Я отслеживаю это, используя переменную "position". </p>

        //Creation of array_C

        int length_C = length_A + length_B;
        int array_C[length_C];

        //Copying array_A to array_C

        for (i = 0; i < length_A; i++) {
          array_C[i] = array_A[i];
        }

        //Checking array_C against array_B for duplicates

        counter = length_A;
        int position = length_A;
        for (i = 0; i < length_B; i++) {
          for (j = 0; j < length_C; j++) {
            if (array_B[i] != array_C[j]) {
              counter--;
            } else {
              counter++;
            }
          }

          //this is the position tracker to add new value in array_C
          if (counter <= 0) {
            array_C[position] = array_B[i];
            position++;
          }
        }

Если я введу это:

Enter the length of array 1: 6
Enter the elements of the array: 1 2 3 4 5 6
Enter the length of array 2: 6
Enter the elements of the array: 3 4 5 6 7 8

Я ожидаю, что результаты должны выглядеть следующим образом:

Here is the merged array:
1 2 3 4 5 6 7 8

Но вместо этого это выглядит так:

1 2 3 4 5 6 3 4 5 6 7 8

Так что, очевидно, что-то идет не так, и он не понимает, что он должен добавлять только переменные, которые не являются дубликатами.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

проблема с логикой внутри вашего внутреннего цикла for.согласно постановке задачи, если какое-либо значение array_c совпадает с любым значением array_b, вы должны избавиться от этого значения, в противном случае добавьте это значение в array_c.так что вы можете просто попробовать сделать следующее.пожалуйста, убедитесь, что вы понимаете код.если у вас есть какие-либо вопросы, не стесняйтесь спрашивать.

   for (i = 0; i < length_B; i++) {
      bool isExistInArrayC = false;
      for (j = 0; j < length_C; j++) {
        if (array_B[i] == array_C[j]) {
          isExistInArrayC = true;
          break;
        } 
      }

      //this is the position tracker to add new value in array_C
      if (isExistInArrayC == false) {
        array_C[position] = array_B[i];
        position++;
      }
    }
0 голосов
/ 04 февраля 2019

Предложения, безусловно, будут работать, но производительность (особенно с массивами большого размера) будет очень плохой.Я бы поддерживал отсортированный массив «C» и выполнял бы двоичный поиск по нему при добавлении целых чисел из массива B. Конечно, для массива C вам понадобится список с двумя связями.

0 голосов
/ 04 февраля 2019

Ваша логика ошибочна.Вот почему вы получаете неожиданный результат.Смотрите следующую версию в вашем коде:

for (i = 0; i < length_B; i++) {
      int skip = 0;
      for (j = 0; j < length_C; j++) {
        if (array_B[i] == array_C[j]) {
          skip=1;
          break;
        } 
      }

      if(skip == 1) continue;
      array_C[position++] = array_B[i];
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...