#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;
}