import
java.util.HashMap;
import
java.util.Map;
public
class
Main {
static
class
RangeInfo {
int
start;
int
end;
int
[] a;
RangeInfo(
int
start,
int
end,
int
[] a)
{
this
.start = start;
this
.end = end;
this
.a = a;
}
}
static
Map<Integer, Integer> mp =
new
HashMap<>();
static
void
func(RangeInfo rptr)
{
for
(
int
i = rptr.start; i <= rptr.end; i++) {
int
curr = rptr.a[i];
synchronized
(mp)
{
Integer freq = mp.get(curr);
if
(freq ==
null
) {
mp.put(curr,
1
);
}
else
{
mp.put(curr, freq +
1
);
}
}
}
}
static
void
numbersOccurringOnce(
int
[] arr,
int
n,
int
t)
{
Thread[] threads =
new
Thread[t];
final
int
spos =
0
;
final
int
epos = spos + (n / t) -
1
;
for
(
int
i =
0
; i < t; i++) {
final
int
start = spos + (n / t) * i;
final
int
end
= i == t -
1
? n -
1
: spos + (n / t) * (i +
1
) -
1
;
RangeInfo rptr =
new
RangeInfo(start, end, arr);
threads[i] =
new
Thread(() -> func(rptr));
}
for
(
int
i =
0
; i < t; i++) {
threads[i].start();
}
for
(
int
i =
0
; i < t; i++) {
try
{
threads[i].join();
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
for
(Map.Entry<Integer, Integer> it :
mp.entrySet()) {
if
(it.getValue() ==
1
) {
System.out.print(it.getKey() +
" "
);
}
}
}
public
static
void
main(String[] args)
throws
InterruptedException
{
Object lock1 =
new
Object();
int
T =
3
;
int
[] arr = {
1
,
0
,
5
,
5
,
2
,
6
};
int
N = arr.length;
numbersOccurringOnce(arr, N, T);
}
}