Задача, с которой столкнулся пользователь, заключается в объединении двух сортированных массивов таким образом, чтобы в результирующем массиве были только уникальные числа, не повторяющиеся в обоих исходных массивах. Это означает, что если число присутствует в обоих массивах, оно не должно быть включено в итоговый массив.
Для решения этой задачи можно использовать следующий алгоритм:
Инициализируем два указателя, которые будут перемещаться по массивам a1 и a2.
Сравниваем элементы массивов по указателям.
Если элементы различаются, добавляем меньший элемент в результирующий массив и перемещаем соответствующий указатель.
Если элементы равны, перемещаем оба указателя, пока не найдем различающиеся элементы.
Повторяем шаги 2-4, пока не достигнем конца одного из массивов.
После достижения конца одного из массивов, добавляем оставшиеся элементы другого массива в результирующий массив.
Пример кода на Object Pascal:
program MergeUniqueArrays;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
procedure MergeUniqueArrays(var a1, a2: array of Integer; n1, n2: NativeInt; var a3: array of Integer; var n3: NativeInt);
var
i, j: NativeInt;
begin
n3 := 0;
i := 0;
j := 0;
SetLength(a3, n1 + n2);
while (i < n1) and (j < n2) do
begin
if a1[i] < a2[j] then
begin
if (n3 = 0) or (a3[n3 - 1] <> a1[i]) then
begin
a3[n3] := a1[i];
Inc(n3);
end;
Inc(i);
end
else if a1[i] > a2[j] then
begin
if (n3 = 0) or (a3[n3 - 1] <> a2[j]) then
begin
a3[n3] := a2[j];
Inc(n3);
end;
Inc(j);
end
else
begin
// Оба элемента равны, пропускаем их
Inc(i);
Inc(j);
end;
end;
// Добавляем оставшиеся элементы из a1, если они уникальны
while (i < n1) do
begin
if (n3 = 0) or (a3[n3 - 1] <> a1[i]) then
begin
a3[n3] := a1[i];
Inc(n3);
end;
Inc(i);
end;
// Добавляем оставшиеся элементы из a2, если они уникальны
while (j < n2) do
begin
if (n3 = 0) or (a3[n3 - 1] <> a2[j]) then
begin
a3[n3] := a2[j];
Inc(n3);
end;
Inc(j);
end;
end;
var
a1, a2, a3: array of Integer;
n1, n2, n3: NativeInt;
begin
SetLength(a1, 9);
SetLength(a2, 4);
a1 := [1, 2, 3, 4, 4, 4, 5, 5, 6];
a2 := [1, 4, 7, 9];
n1 := Length(a1);
n2 := Length(a2);
SetLength(a3, n1 + n2);
MergeUniqueArrays(a1, a2, n1, n2, a3, n3);
// Выводим результат
for var i := 0 to n3 - 1 do
Write(a3[i], ' ');
Writeln;
Readln;
end.
Этот код решает поставленную задачу, объединяя два массива с учетом уникальности чисел. Результирующий массив a3 будет содержать уникальные числа из обоих исходных массивов a1 и a2 в отсортированном виде.
Пользователь столкнулся с задачей объединения двух отсортированных массивов в один, содержащий уникальные числа, которые не повторяются в обоих исходных массивах, и при этом итоговый массив должен быть отсортирован.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.