Для заданного массива, состоящего из 100 целых чисел, сначала вывести все числа, встречающиеся в нем несколько раз, а затем все числа, встречающиеся в нем только один раз.
Основная идея: во вс массиве p строим двусвязный список, элементы которого указывают на предка и потомка члена массива, имеющего такое же значение. Сначала выводим элементы, имеющие потомков, но не имеющие предков - это будут элементы, которые встречаются более одного раза, а их порядок следования совпадет с порядком следования в массиве. Затем выводим элементы, которые не имеют ни предков, ни потомков, т.е. встречаются в массиве один раз.
const n = 100;
var a: array[1..n] of integer; p: array[1..n, 1..2] of integer; {3 - индекс предыдущего элемента 4 - индекс следующего элемента} i, j, e: integer;
begin Randomize; for i := 1 to n do begin e := Random(51) - 25; a[i] := e; p[i, 1] := 0; p[i, 2] := 0 end; for i := 2 to n do begin j := i - 1; e := a[i]; repeat if e = a[j] then begin p[j, 1] := i; p[i, 2] := j; j := 0 end else j := j - 1 until j = 0 end; for i := 1 to n do if (p[i, 1] > 0) and (p[i, 2] = 0) then write(a[i]:4); for i := 1 to n do if (p[i, 1] = 0) and (p[i, 2] = 0) then write(a[i]:4); writeln end.
const
n = 100;
var
a: array[1..n] of integer;
p: array[1..n, 1..2] of integer;
{3 - индекс предыдущего элемента
4 - индекс следующего элемента}
i, j, e: integer;
begin
Randomize;
for i := 1 to n do
begin
e := Random(51) - 25;
a[i] := e;
p[i, 1] := 0;
p[i, 2] := 0
end;
for i := 2 to n do
begin
j := i - 1;
e := a[i];
repeat
if e = a[j] then
begin
p[j, 1] := i;
p[i, 2] := j;
j := 0
end
else
j := j - 1
until j = 0
end;
for i := 1 to n do
if (p[i, 1] > 0) and (p[i, 2] = 0) then write(a[i]:4);
for i := 1 to n do
if (p[i, 1] = 0) and (p[i, 2] = 0) then write(a[i]:4);
writeln
end.
Тестовое решение:
-15 -21 -4 24 20 16 4 14 3 1 25 -9 -14 10 12 -13 9 -2 -16 -10 -25 21 2 8 15 -1 19 22 18 -23 6 -6 -17 -24 17 -20 -7 -12 -19 -3 7 23