Другие языки программирования и технологии

Си. Как проверить, есть ли в одномерном массиве повторяющиеся элементы?

Пробегая по массиву запомнить элементы, если они снова встретятся поставить единичку около каждого повторяющегося
Alexandr Shlomov
Alexandr Shlomov
11 198
Лучший ответ
Вениамин Штатный В смысле единичку около элемента? Так не выйдет.
Куаныш Садуакасов Си не знаю, потому опишу работу кода, а потом напишу пример на пайтоне.
.
1) Создаем второй массив
2) Циклом for перебираем все элементы первого массива
3) Каждый раз проверяем, есть ли элемент во втором массиве
4) Если элемента во втором массиве нет, то добавляем его туда
.
Пример на пайтоне.
.
first_list = ["саша", "леша", "сережа", "ваня", "леша", "гоша", "ваня"]
.
second_list = []
.
for i in first_list:
____if i not in second_list:
________second_list.append(i)
.
print(second_list)
.
Вывод:
.
["саша", "леша", "сережа", "ваня", "гоша"]
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#define SIZE_BOX 8
int compare(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}
_Bool find(int* vec) {
int tmp[SIZE_BOX];
int i, j;
for (i = 0; i < SIZE_BOX; ++i) tmp[i] = vec[i];
qsort(vec, SIZE_BOX, sizeof(int), compare);
for (i = 0, j = 1; j < SIZE_BOX; ++j) if (tmp[i] == tmp[j]) return true;
return false;
}
void show(int* vec) {
int i;
for (i = 0; i < SIZE_BOX; ++i) printf_s(" %i", vec[i]);
}
int main(void) {
int v[SIZE_BOX] = { 27, 14, 32, 17, 25, 13, 11, 77 };
int w[SIZE_BOX] = { 99, 14, 32, 17, 99, 13, 11, 77 };
show(v);
printf_s(" : %s\n", find(v) ? "yes" : "no");
show(w);
printf_s(": %s\n", find(w) ? "yes" : "no");
getchar();
}
вложенный цикл, во внешнем проход по всем ячейкам, во внутреннем - проход со следующей ячейки до конца и проверка на совпадения
Виталий Ложкин
Виталий Ложкин
87 580
Отсортируй с помощью быстрой сортировкой. Пробегись 1 раз по отсортированному (проверить на равенство соседние элементы можно)
Есть несколько вариантов реализации.
Один из вариантов:
Создаем цикл в цикле. Наружний цикл будет бежать по элементам массива, внутренний цикл будет проверять текущий элемент массива с последующими элементами и если совпадение то где то в отдельном массиве сохранять совпавшие элементы.

N - размер массива
arrayOfElement - сам массив
arrayOfDoubleElement - массив для сохранения совпавших элементов

int currentElement = 0; //Это счетчик показывающий сколько элементов было найдено и за счет
//него происходит запись элемента в нужную "ячейку" массива

for(int i = 0; i < N-1; ++i)
{
int temp = arrayOfInt[i]; // Временная переменная содержащая элемент для проверки
for(j =i+1; j < N; ++j)
{
if(temp == arrayOfInt[j]) //если элемент найден далее в массиве
{
arrayOfDoubleElement[currentElement] = temp; //сохраняем этот элемент
currentElement++; //увеличиваем счетчик элементов
break; // выход из текущего цикла для проверки следующего элемента
//потому что элемент уже совпадает и нет смысла проверять его далее
}
}
}

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

countOfElement[256]; // массив для подсчета элементов обязательно нужно инициализировать нулями, что у меня не показано.

char arrayOfElement[N]; // массив содержащий парные элементы

for(int i = 0; i < N; ++i)
{
countOfElement[arrayOfElement[i]]++; // в цикле увеличиваем массив с индексом нашего элемента
}

for(int i = 0; i < 0; ++i)
{
if(countOfElement[i] > 1)
printf("Этот элемент встречается более одного раза в массиве: %i", i);
}
Евгений Еремин
Евгений Еремин
15 408
Си не знаю, потому опишу работу кода, а потом напишу пример на пайтоне.
.
1) Создаем второй массив
2) Циклом for перебираем все элементы первого массива
3) Каждый раз проверяем, есть ли элемент во втором массиве
4) Если элемента во втором массиве нет, то добавляем его туда
.
Пример на пайтоне.
.
first_list = ["саша", "леша", "сережа", "ваня", "леша", "гоша", "ваня"]
.
second_list = []
.
for i in first_list:
____if i not in second_list:
________second_list.append(i)
.
print(second_list)
.
Вывод:
.
["саша", "леша", "сережа", "ваня", "гоша"]
Вениамин Штатный На Си надо будет прописать функцию, которая проверит, есть ли в первом массиве такой-то элемент. Там будет несколько больше for. Перевожу на Си:

#include
short i,z,r,j;
short tst(char str[6], char* ptr[7][6]){
for (j = 0; j < 7; j++){
if (ptr[j] == str){
r = 1;
break;
}}
return r;}
void main(){
char first_list[7][6] = {"саша", "леша", "сережа", "ваня", "леша", "гоша", "ваня"};
char second_list[7][6];
for (i = 0; i < 7; i++){
if (tst(first_list[i], &first_list) != 1){
second_list[i] = first_list[i];
}}
for (z=0; z < 6; z++){
if (second_list[z] != NULL){
printf("%s ", &second_list[z]);
}}
}
Вроде так
int arrayHasRep(int n, int *arr)
{
int i, j;
for (i = 0; i < n - 1; ++i) {
for (j = i + 1; j < n; ++j) {
if (arr[i] == arr[j]) {
return 1;
}
}
}
return 0;
}
Алексей Кобельков вопрос. после return 1 выполнение циклов прерывается? или же все же надо ставить bteak ?

Похожие вопросы