Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Объединить два массива в один, с не общими элементами без повтора

#cpp


Необходимо два массива объединить в один и оставить в нем только не общие элементы.
Например arr1 {1,2,3,4} + arr2{1,1,5,6}, результат arr3 {3,4,6}.

const int SIZE1 = 8;
const int SIZE2 = 5;
int arr1[SIZE1] = { 0 };
int arr2[SIZE2] = { 0 };
cout << "First array\n";
for (int i = 0; i < SIZE1; i++){
    arr1[i] = rand() % 20;
    cout << arr1[i] << '\t';
}

cout << "\nSecond array\n";
for (int i = 0; i < SIZE2; i++){
    arr2[i] = rand() % 20;
    cout << arr2[i] << '\t';
}
cout << endl;
const int SIZE3 = SIZE1 + SIZE2;
int arr3[SIZE3] = { 0 };
cout << "Third array\n";
for (int i = 0; i < SIZE3; i++){
    arr3[i] = arr1[i];
    if (i >= SIZE1)
        arr3[i] = arr2[i-SIZE1];
    cout << arr3[i] << '\t';
}
cout << endl;
const int SIZE4 = SIZE3;
int arr4[SIZE4] = { 0 };
int size4 = 0;
for (int i = 0; i < SIZE4; i++){
    for (int j = 0; j < SIZE4; j++){
        if (arr3[i] == arr3[j]&&i!=j)
            break;
        else if (arr3[i] != arr3[j]&&j


Ответы

Ответ 1



В C++ весь нужный функционал уже есть, надо только им воспользоваться. Искомое называется "Симметрическая разность множеств". #include #include #include #include #include using std::set; using std::vector; using std::set_symmetric_difference; using std::ostream_iterator; using std::cout; int main() { vector first={7,1,1,2,3}; vector second={6,1,2,5,6,7}; const set alpha(begin(first),end(first)); const set beta(begin(second),end(second)); ostream_iterator out(cout,", "); set_symmetric_difference(begin(alpha),end(alpha),begin(beta),end(beta),out); return 0; } IDEONE Сперва мы задаем наши массивы first и second. Затем, конвертируем во множество - std::set Затем, находим разность и сразу выдаем на терминал; Послесловие Я прекрасно понимаю, что это "учебная" задача, нацеленная на изобретение велосипеда, но. Такая задача к практике не готовит никак. Потому как в реальности, все вакансии программиста C++ требуют знания STL. А наше дурное образование STL игнорирует.

Ответ 2



Так вот, решение которое я реализовала: const int SIZE1 = 5; const int SIZE2 = 7; int arr1[SIZE1] = { 0 }; int arr2[SIZE2] = { 0 }; for (int i = 0; i < SIZE1; i++) cout << (arr1[i] = rand() % 10) << "\t"; cout << endl; for (int i = 0; i < SIZE2; i++) cout << (arr2[i] = rand() % 10) << "\t"; cout << endl; const int SIZE3 = SIZE2+SIZE1; int arr3[SIZE3] = { 0 }; int size3 = 0; //сравниваем 1 со вторым, разницу записыв в 3 for (int i = 0; i < SIZE1; i++) { for (int j = 0; j < SIZE2; j++) { if (arr1[i] == arr2[j]) { break; } else if (arr1[i] != arr2[j]) { bool exist = false; for (int k = 0; k < size3; k++) { if (arr1[i] == arr3[k]) { exist = true; break; } } if (exist == false&&j==SIZE2-1) { arr3[size3] = arr1[i]; size3++; break; } } } } //сравниваем 2 массив с первым, разницу записываем в 3 с места где закончилась запись сравнения 1 и 2 for (int i = 0; i < SIZE2; i++) { for (int j = 0; j < SIZE1; j++) { if (arr2[i] == arr1[j]) { break; } else if (arr2[i] != arr1[j]) { bool exist = false; for (int k = 0; k < size3; k++) { if (arr2[i] == arr3[size3-k]) { exist = true; break; } } if (exist == false && j == SIZE1 - 1) { arr3[size3] = arr2[i]; size3++; break; } } } } cout << "Array 3\n"; for (int i = 0; i < size3; i++) { cout << arr3[i] << "\t"; } Всем участника спасибо за помощь!

Ответ 3



Ну, если задание учебное, и вас все равно устраивает эффективность O(n*m), то можно сделать так - при сравнении сразу добавлять в выходной массив: bool search(int value, int * begin, int * end) { for(;begin != end; ++begin) if(*begin == value) return true; return false; } int main(int argc, const char * argv[]) { srand(time(nullptr)); const int SIZE1 = 10; const int SIZE2 = 5; int arr1[SIZE1] = { 0 }; int arr2[SIZE2] = { 0 }; int arr [SIZE1+SIZE2] = { 0 }; int size = 0; for (int i = 0; i < SIZE1; i++) cout << (arr1[i] = rand() % 15) << "\t"; cout << endl; for (int i = 0; i < SIZE2; i++) cout << (arr2[i] = rand() % 15) << "\t"; cout << endl; for (int i = 0; i < SIZE1; i++) { if (search(arr1[i],arr2,arr2+SIZE2)) continue; arr[size++] = arr1[i]; } for (int i = 0; i < SIZE2; i++) { if (search(arr2[i],arr1,arr1+SIZE1)) continue; arr[size++] = arr2[i]; } for (int i = 0; i < size; i++) cout << arr[i] << "\t"; cout << endl; } Правда, так мы не убираем дубли в одном массиве (но если они допустимы во входном, почему их не должно быть в выходном?) - но это просто, надо только добавить в циклы search еще и по выходному массиву.

Комментариев нет:

Отправить комментарий