-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfind_duplicate.c
39 lines (31 loc) · 887 Bytes
/
find_duplicate.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// iterujemy po elementach a[]
// skaczemy do tego indeksu, jaką wartość odwiedziliśmy
// element, do którego przeskoczyliśmy:
// - albo mnożymy razy -1
// - albo odejmujemy od niego n
// jeżeli element, do którego wskoczyliśmy jest ujemny, znaleźliśmy duplikat
#include <stdio.h>
#include <stdlib.h>
// size(a) = n + 1
// a[] zawiera elementy od 1 do n
int find_duplicate(int n, int a[]) {
int i = 0;
int counter = 0;
while (counter < n + 1) {
if (a[i] < 0)
return -a[i];
a[i] *= (-1);
i = -a[i];
counter++;
}
return -1;
}
int main() {
int n;
if (!scanf("%d", &n), printf("invalid value\n"));
int *a = (int *)malloc((size_t)n * sizeof(int));
for (int i = 0; i < n; i++)
if (!scanf("%d", &a[i]), printf("invalid value\n"));
printf("%d", find_duplicate(n, a));
return 0;
}