Нужно печатать повторяющиеся числа только один раз / C

#c #repeat

#c #повторить

Вопрос:

Невозможно использовать библиотеки и другие методы.

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

В качестве примера, если введено:

7 1 1 2 1 2 2 9

Он должен печатать

1 2

В случае, если повторяющегося числа нет:

7 1 2 3 4 5 6 7

Не должно быть никаких выходных данных!

Также обратите внимание, что первое число — это длина array :

 #include <iostream>

int main() 
{
  unsigned size;
  std::cin >> size;
  int* myArray = new int[size];
  
  for (int i = 0; i < size; i  ) {
      std::cin >> myArray[i];
  }

  for (int i = 0; i < size; i  ) {
    bool found = false;
    for (int j = 0; j < i amp;amp; !found; j  ) {
        found = (myArray[i] == myArray[j]);
    }
    if (!found) {
        std::cout << myArray[i] << " ";
    } 
  }
   


   delete []myArray;
}
  

Комментарии:

1. То, что вы получаете, — это именно то, что вы реализовали. Итак, ваш алгоритм выполняет не то, что вы намеревались сделать: выведите число, если оно не повторяется в конечном массиве.

2. Нет, 6 — это длина массива

3. Гарантируется ли сортировка входных данных?

Ответ №1:

Вероятно, самым простым подходом было бы использовать set , но я не уверен, разрешено ли это в соответствии с правилом «нельзя использовать другие библиотеки».

Используя только массивы, для каждого элемента вы могли бы перебирать все элементы, предшествующие ему, и печатать его только в том случае, если он там не был найден:

 for (int i = 0; i < size; i  ) {
    bool found = false;
    for (int j = 0; j < i amp;amp; !found; j  ) {
        found = (myArray[i] == myArray[j]);
    }
    if (!found) {
        cout << myArray[i] << " ";
    }
}
  

Комментарии:

1. Да, нужно добавить условие, чтобы не проверять числа, которые, как мне кажется, только один раз, потому что, если ввести 5 1 2 3 4 5, он напечатает 1 2 3 4 5. Я прав?

2. @Ted Lyngmo, нет необходимости печатать эти числа, только те, которые встречались более одного раза.

3. set::insert выполните задание: en.cppreference.com/w/cpp/container/set/insert проверьте, есть ли bool в паре false . Если значение равно false, выведите

Ответ №2:

Первое вхождение повторяющегося числа не имеет вхождений перед ним и, по крайней мере, одного после него.
Это достаточно легко обнаружить:

 for (int i = 0; i < size; i  ) {
    bool before = false;
    for (int j = 0; j < i amp;amp; !before; j  ) {
        before = myArray[i] == myArray[j];
    }
    if (!before) {
        bool after = false;
        for (int j = i   1; j < size amp;amp; !after; j  ) {
            after = myArray[i] == myArray[j];
        }
        if (after)
        {
            cout << myArray[i] << " ";
        }
    }
}
  

Ответ №3:

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

 #include <iostream>

int main() 
{
  unsigned size;
  std::cin >> size;
  int* myArray = new int[size];
  
  for (int i = 0; i < size; i  ) {
      std::cin >> myArray[i];
  }

  for (int i = 0; i < size; i  ) {
    int count = 0;
    //check if the number has already been found earlier
    for (int j = 0; j < i amp;amp; !count; j  ) {
        if(myArray[i] == myArray[j]) count  ;
    }
    //check the rest of the array for the repeated number
    if (!count) {
       for (int j = i; j < size; j  ) {
        if(myArray[i] == myArray[j]) count  ;
       } 
    }
    //print if repeated
    if (count > 1) {
        std::cout << myArray[i] << " ";
    } 
  }
   
   delete []myArray;
}