Задача 11 Урок 15

Задача 11 Урок 15

Напишите функцию, которая определяет являются ли значения переданного массива целых чисел уникальными относительно друг друга, если среди есть неуникальные элементы, то удалите их, сдвинув значения влево, заполняя оставшиеся справа ячейки нулями.
Протестируйте работу функции на массиве из 7 случайных элементов из диапазона от 1 до 15-ти.
Например для:

|1|-3|5|-3|9|5|8|
получим:

|1|9|8|0|0|0|0|

program lesson15_11;

type
    myArr = array[1..7] of integer;

function unique(a: myArr): myArr;
var
    b: myArr;
    i, j, temp: integer;
begin
    j := 1;
    for i := low(a) to high(a) - 1 do
    begin
        temp := a[i];
        while j < high(a) do
        begin
            if temp = a[j + 1] then
            begin
                a[i] := 0;
                a[j + 1] := 0;
            end;
            j := j + 1;
		end;
		j := i + 1;
	end;

    for i := low(b) to high(b) do
        b[i] := 0;

    j := 1;
    for i := low(a) to high(a) do
        if a[i] > 0 then
        begin
            b[j] := a[i];
            j := j + 1;
    	end;

    result := b;
end;

var
    arr, newArr: myArr;
    i: integer;
begin
    randomize();
    for i := low(arr) to high(arr) do
    begin
        arr[i] := 1 + random(15);
        write(arr[i], '|');
	end;

    writeln();

    newArr := unique(arr);
    for i := low(newArr) to high(newArr) do
        write(newArr[i], '|');

    readln();
end.
vedro-compota's picture

попробуйте переделать без дополнительного массива

_____________
матфак вгу и остальная классика =)

program lesson15_11;

type
    myArr = array[1..7] of integer;

function unique(a: myArr): myArr;
var
    i, j, temp, nul: integer;
begin
    j := 1;
    nul := 0;
    for i := low(a) to high(a) - 1 do
    begin
        temp := a[i];
        while j < high(a) do
        begin
            if temp = a[j + 1] then
            begin
                a[i] := 0;
                a[j + 1] := 0;
            end;
            j := j + 1;
		end;
		j := i + 1;
	end;

    for i := low(a) to high(a) do
        if a[i] = 0 then
            nul := nul + 1;

    for j := 1 to nul do
        for i := low(a) to high(a) - 1 do
            if (a[i] = 0) then
            begin
                a[i] := a[i + 1];
                a[i + 1] := 0;
		    end;

	result := a;
end;

var
    arr, newArr: myArr;
    i: integer;
begin
    randomize();
    for i := low(arr) to high(arr) do
    begin
        arr[i] := 1 + random(15);
        write(arr[i], '|');
	end;

    writeln();

    newArr := unique(arr);

    for i := low(newArr) to high(newArr) do
        write(newArr[i], '|');

    readln();
end.
vedro-compota's picture

  for j := 1 to nul do
        for i := low(a) to high(a) - 1 do
            if (a[i] = 0) then
            begin
                a[i] := a[i + 1];
                a[i + 1] := 0;
            end;

-- попробовать

сейчас сложность k*N
можно добавиться сложности N + k

Начальные преобразования:
1 3 2 3 5 6 5
1 0 2 0 0 6 0
Далее можно за один цикла перейти к ситуации:

1 2 6 0 0 6 0

_____________
матфак вгу и остальная классика =)

program lesson15_11;

type
    myArr = array[1..15] of integer;

function unique(a: myArr): myArr;
var
    i, j, temp, index: integer;
begin
    j := 1;
    for i := low(a) to high(a) - 1 do
    begin
        temp := a[i];
        while j < high(a) do
        begin
            if temp = a[j + 1] then
            begin
                a[i] := 0;
                a[j + 1] := 0;
            end;
            j := j + 1;
		end;
		j := i + 1;
	end;

    index := -1;
    i := low(a);
    while i <= high(a) do
    begin
        if (a[i] = 0) and (index = -1) then
            index := i
		else if (a[i] <> 0) and (index <> -1) then
        begin
            a[index] := a[i];
            a[i] := 0;
            i := index + 1;   // возвращаемся назад
            index := -1;
            continue;
		end;
        i := i + 1;
	end;
	result := a;
end;

var
    arr, newArr: myArr;
    i: integer;
begin
    randomize();
    for i := low(arr) to high(arr) do
    begin
        arr[i] := 1 + random(15);
        write(arr[i], '|');
	end;

    writeln();

    newArr := unique(arr);

    for i := low(newArr) to high(newArr) do
        write(newArr[i], '|');

    readln();
end.
vedro-compota's picture

решение засчитано

_____________
матфак вгу и остальная классика =)