Исключение одинаковых элементов массива

Задача

Допустим, у нас есть массив, содержащий различные численные значения. Требуется исключить из него одинаковые элементы.

Для упрощения задачи будем копировать значения из одного массива в другой. Если значение повторяется, то оно не копируется. Обычно массивы до заполнения не пусты, а могут быть заполнены, например, нулями. Если исходный (сжимаемый массив) содержит нули, то с учетом нижеследующего алгоритма второй массив их содержать не должен.

Решение

Алгоритм решения задачи: 

Рассмотрим непосредственно алгоритм копирования выбранных элементов.

  1. Массив под уникальные элементы заполняется значениями, которые точно не встречаются в сжимаемом массиве.
  2. Нам требуется просмотреть все элементы исходного массива (for i := 1 to n do).
  3. Будем копировать элемент и увеличивать индекс массива (s[k] := a[i]; k := k+1) только в том случае, если такого элемента нет во втором массиве.
  4. Чтобы определить, был уже такой элемент или нет, нужно просмотреть второй массив (for l := 1 to k do).
  5. И если элемент присутствует, то надо исключить его копирование.
  6. Для этого используется переменная логического типа (flag), играющая роль так называемого флага. Ей присваивается значение false.
  7. Копирование возможно лишь в том случае, если значение flag остается true. Оно таким и остается, если элемент уникален.

Программа на языке Паскаль: 

 

const
    n = 20;
 
var
    a: array[1..n] of integer; //сжимаемый массив
    s: array[1..n] of integer; //сжатый массив
    i,k,l: integer;
    flag: boolean;
 
begin
    randomize;
 
    for i := 1 to n do begin
        a[i] := random(10);
        write (a[i]:3)
    end;
    writeln;
 
    for i := 1 to n do
        s[i]:=-1;
 
    k := 1;
    for i := 1 to n do begin
        flag := true;
        for l := 1 to k do
            if s[l] = a[i] then
                flag := false;
        if flag = true then begin
            s[k] := a[i];
            k := k+1
        end;
    end;
 
    for i := 1 to k-1 do
        write (s[i]:3);
 
readln
end.

Ошибка "Почему-то из исходного массива не копируется ноль." была исправлена. Взято из комментария:

Потому что изначально элементы массива s[l] не пустые, а могут быть равны 0 и вот эта строчка

<code>if s[l] = a[i] then flag := false;</code>

выполняется.
Решение простое при заполнении массива a[i] заполнить еще и массив s[i] любыми НЕ допустимыми числами, т.е. если числа сжимаемого массива могут быть от 0 до 10, массив s[i] заполнить скажем -1.

Тема

Одномерные массивы

Уровень

Сложные задачи

Теги

Добавить комментарий