打印两个数组中的非公共元素

print non common elements from two arrays

本文关键字:元素 数组 两个 打印      更新时间:2023-10-16

我正在尝试打印两个数组之间的非公共元素。例如如果array1 = { 1, 3, 5}array2 = {1, 2, 4, 5},我的输出应该是{2, 3, 4}

我在这里尝试了一些东西。但它只打印 3。我做错了什么?

#include<iostream>
using namespace std;
int main()
{
    int a[] = { 1, 3, 5 };
    int b[] = { 1, 2, 4, 5 };
        bool contains = false;
        int result[10];
        int r = 0;
        int x;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            if (a[i] == b[j]) {
                contains = true;
                break;
            }
        }
        if (!contains) {
            result[r]=a[i];
            ++r;
        }
        else{
            contains = false;
        }
    }
    for (x = 0; x < r; x++)
    {
        cout<< result[x]<<"n";
    }
return 0;
}

您没有将唯一值从 b 添加到 result 。但这是 c++。我建议使用std::vectorstd::sortstd::set_symmetric_differencestd::back_inserter

#include <iostream>     // std::cout
#include <algorithm>    // std::set_symmetric_difference, std::sort
#include <iterator>     // std::back_inserter
#include <vector>       // std::vector
int main()
{
    std::vector< int > a = { 1, 3, 5 };
    std::vector< int > b = { 1, 2, 4, 5 };
    std::sort( a.begin(), a.end() );
    std::sort( b.begin(), b.end() );
    std::vector< int > result;
    std::set_symmetric_difference( a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result) );
    for ( int x : result )
        std::cout << x << "n";
    return 0;
}

现场示例

正如@ChristianHackl在下面的评论中所建议的那样,也可以使用数组进行ab,并使用独立的函数std::beginstd::end

#include <iostream>     // std::cout
#include <algorithm>    // std::set_symmetric_difference, std::sort
#include <iterator>     // std::back_inserter
#include <vector>       // std::vector, std::begin, std::end
int main()
{
    int a[]{ 1, 3, 5 };
    int b[]{ 1, 2, 4, 5 };
    std::sort( std::begin(a), std::end(a) );
    std::sort( std::begin(b), std::end(b) );
    std::vector< int > result;
    std::set_symmetric_difference( std::begin(a), std::end(a), std::begin(b), std::end(b), std::back_inserter(result) );
    for ( int x : result )
        std::cout << x << "n";
    return 0;
}

您将a中的所有"唯一"值添加到result但忘记将b中的所有值添加到result

编辑

像这样:

for (int i=0; i < sizeof(b)/sizeof(int); ++i, ++r)
{
    result[r] = b[i];
}

你的算法在这里是错误的。首先,您的代码以 o(a*b) 运行,其中 a 和 b 是列表长度。

此外,它只生成 A 中的元素,而不生成 B 中的元素。

执行此操作的方法是对两个列表进行排序,然后浏览 A 和 B,移动到最小的当前元素,如果两个当前元素不同,则将其添加到结果中。
这将在 o(log a + log b + a + b 中运行)。