задача 1 урок 23

задача 1 урок 23
Есть массив целых чисел (10 элементов), например:

[1, 3, 2, 1, 3, 2, 2, 4, 0, -5]
Задача: вывести на экран все числа, которые встречаются нечетное число раз.
Т.е. в данном случае это:
2, 4, 0, -5

Решите:

любым способом
за 1 прочтение массива (сложность меньше или равную N) с результатом, готовым к выводу, без проверок каждого элемента.

Решение №1

program Project1;
type arr = array[1..10] of integer;
var i,j,c: integer;
    a: arr;
    flag: boolean;
function check(b: arr; i: integer): boolean;
var j: integer;
begin
  result := false;
  if i - 1 = 0 then
    exit;
  for j := i - 1 downto 1 do
    if b[i] = b[j] then
      result := true;
end;
begin
  //[1, 3, 2, 1, 3, 2, 2, 4, 0, -5]
  a[1] := 1;
  a[2] := 3;
  a[3] := 2;
  a[4] := 1;
  a[5] := 3;
  a[6] := 2;
  a[7] := 2;
  a[8] := 4;
  a[9] := 0;
  a[10] := -5;

  flag := false;
  for i := 1 to 10 do
    begin
      c := 1;
      flag := check(a, i);
      if flag = false then
      begin
        for j := i + 1 to 10 do
        begin
          if a[i] = a[j] then
          c:= c + 1;
        end;
        if (c mod 2) = 1 then
          write(a[i], ' ');
      end;
    end;
  readln
end.

Решение №2

program Project1;
type arr = array[1..10] of integer;

var i: integer;
    a: arr;
    flag: boolean;

function check(b: arr; i: integer): boolean;  // избегать повторов
var j: integer;
begin
  result := false;
  if i - 1 = 0 then
    exit;
  for j := i - 1 downto 1 do
    if b[i] = b[j] then
      result := true;
end;

function find(b: arr; i: integer): integer; // считает кол-во элементов
var k, count: integer;
begin
    count := 1;
    if i = 10 then
      result := 1
    else
    begin
    for k := i + 1 to 10 do
      if b[i] = b[k] then
        count := count + 1;
    result := count;
    end;
end;

begin
  //[1, 3, 2, 1, 3, 2, 2, 4, 0, -5]
  a[1] := 1;
  a[2] := 3;
  a[3] := 2;
  a[4] := 1;
  a[5] := 3;
  a[6] := 2;
  a[7] := 2;
  a[8] := 4;
  a[9] := 0;
  a[10] := -5;

  for i := 1 to 10 do
    begin
      flag := check(a, i);
      if flag = false then
      begin
        if (find(a, i) mod 2) = 1 then
          write(a[i], ' ');
      end;
    end;
  readln
end.

Консоль

[1, 3, 2, 1, 3, 2, 2, 4, 0, -5] 
2 4 0 -5