Я пытаюсь найти объединение из 2 отсортированных массивов (с дубликатами), но я чувствую, что не придумываю самый элегантный код (что у меня есть работы кстати, Я просто чувствую, что могу сократить некоторые строки кода). Допустим, что у меня есть 2 вектора a = {1,3,3,4,4,4,5,7} и b = {1,3,3,3,5,5,5,6,8,9}} и Я хочу сохранить свой союз в векторе называется unionVector (который будет 1,3,4,5,6,7,8,9)Поиск объединения 2 отсортированных массивов (с дубликатами)
Вот мой код:
#include <iostream>
#include <vector>
using namespace std;
// Prints the contents of a vector
void printVector(vector<int> a){
if(a.size() == 0)
return;
else{
for(int i = 0; i < a.size(); i++)
cout << a[i] << '\t';
}
cout << endl;
}
// Print the union of 2 sorted arrays with duplicates
void printUnion(int *a, int aSize, int *b, int bSize){
if(aSize == 0 && bSize == 0)
return;
else{
vector<int> unionVector;
int i = 0;
int j = 0;
int last = 0;
// insert the smaller of first element regardless
if(a[i] < b[j]){
unionVector.push_back(a[i]);
i++;
}
else if (b[j] < a[i]){
unionVector.push_back(b[j]);
j++;
}
else{// both are equal numbers
unionVector.push_back(a[i]);
i++;
j++;
}
// now traverse both the loops one increment at a time
while(i < aSize && j < bSize){
last = unionVector[unionVector.size() - 1];
if(a[i] < b[j]){
if(last != a[i])
unionVector.push_back(a[i]);
i++; // increment i in either case
}
else if(b[j] < a[i]){
if(last != b[j])
unionVector.push_back(b[j]);
j++;
}
else{
// both of the numbers are equal
if(last != a[i])
unionVector.push_back(a[i]);
i++;
j++;
}
}
// lets say if 1 array wasn't complete
while(i < aSize){
last = unionVector[unionVector.size() - 1];
if(last != a[i])
unionVector.push_back(a[i]);
i++;
}
while(j < bSize){
last = unionVector[unionVector.size() - 1];
if(last != b[i])
unionVector.push_back(b[j]);
j++;
}
printVector(unionVector);
}
}
int main(){
int a[] = {1,3,3,4,4,4,5,7};
int b[] = {1,3,3,3,5,5,5,6,7,7,8,9};
printUnion(a,8,b,12);
return 0;
}
Вещь так как могут быть дубликаты. Я проверяю элемент, который должен быть вставлен с последним элементом, вставленным в unionVector. Мне нужно убедиться, что я не пытаюсь получить «последний» элемент, когда unionVector пуст, поэтому я все равно вставляю 1 элемент в unionVector. Я бы очень признателен, если кто-нибудь может предложить способ, которым я могу выполнить эту проверку, не вставляя сначала один элемент (я думал о наличии переменной флага, которая проверяет, является ли unionVector пустым или нет, но я чувствую, что это будет слишком грязно)
Edit 1:
- Это не проблема домашних заданий. Это то, что я практиковал для своих интервью
Изменить 2:
- Я также не могу использовать любые встроенные функции
Edit 3:
- Некоторые люди путались, если это было для позиции C++. Вы можете использовать любой язык, который вы хотите.
Вы фактически хотите этап слияния сортировки слияния, но игнорируете дубликаты. Это может сделать ваш алгоритм более простым, поскольку он немного запутан для меня, по крайней мере. – BlamKiwi
Скопируйте оба массива в 'std :: set'? –
@ThomasMatthews Я подозреваю, что это код домашней работы. – BlamKiwi