从两个数组中打印非常见元素

时间:2016-02-21 17:42:14

标签: c++ arrays

我正在尝试在两个数组之间打印非常见元素。例如, 如果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;
}

3 个答案:

答案 0 :(得分:5)

您没有将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;
}

Live Example

正如@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;
}

答案 1 :(得分:3)

您添加了所有&#34; unique&#34;从aresult的值,但您忘记将b中的所有值添加到result

修改

类似的东西:

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

答案 2 :(得分:0)

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

此外,它只生成A中但不包含在B中的元素。

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