如何比较一个数组的每个元素与另一个数组如果存在然后打印是否则否

时间:2017-01-29 05:33:36

标签: c++ arrays loops sorting

#include<iostream> 
using namespace std;
int main()
{
    int a[8] = { 1, 2, 3, 6, 4, 8, 12, 5 }; 
    int b[6] = { 1, 3, 12, 5, 9, 10 };    
    for (int i = 0; i < 8; i++)
    {
        for(int j=0;j<6;j++)
        {
            if(b[j]==a[i])
            {
                cout<<"Yes"<<endl;
            }
        }
        cout<<"NO"<<endl;
    }
}

我必须比较这些数组和第二个数组的元素存在于第一个数组然后打印是否否 。 我正在输出

Yes
NO
NO
Yes
NO
NO
NO
NO
Yes
NO
Yes
NO

我必须得到像这样的输出

yes
yes
yes
yes
No
No

5 个答案:

答案 0 :(得分:3)

这里要提到的主要观点是,一旦找到匹配项,您需要从内循环中break;

此外,您需要确保打印“是”或“否”。正如您的程序目前所在,它将在内循环后无条件地打印“否”。你可以利用一面旗帜来实现这一目标。

最后,正如您的逻辑所述,“....第二个数组的元素存在于第一个数组”中,您需要更改循环结构以反映这一点。外部循环应该用于索引第二个数组b,而在内部循环中,你应该遍历第一个数组a

你需要做类似的事情(伪代码,未经过测试

for (int j=0; j<6; j++) {
int flag = 0;   //reset the flag

    for(int i=0; i<8; i++) {
        if(b[j]==a[i])
        {
            cout<<"Yes"<<endl;
            flag = 1;
            break;
        }
    }

    if (!flag) cout<<"NO"<<endl;
 }

答案 1 :(得分:2)

根据您在问题中的既定目标,您应该枚举您的第二个数组(b[])作为外部循环,在第一个数组(a[])中搜索其每个值作为内部循环,最重要的是,如果你找到一个匹配因此知道是或否应该打印,那么用检测打破循环(内循环外部的代码知道你提前破了)

简而言之,您的算法是向后但仍未完成。修复算法并使用ranged-for作为枚举方法(使用它或使用像你现在这样的下标,由你决定),给我们:

#include <iostream>

int main()
{
    int a[8] = { 1, 2, 3, 6, 4, 8, 12, 5 };
    int b[6] = { 1, 3, 12, 5, 9, 10 };

    for (auto x : b)
    {
        bool found = false;
        for (auto y : a)
        {
            if (x == y)
            {
                found = true;
                break;
            }
        }
        std::cout << (found ? "Yes" : "NO") << '\n';
    }
}

<强>输出

Yes
Yes
Yes
Yes
NO
NO

答案 2 :(得分:2)

其他答案已经给出了破解算法的原因。我想给你一个提示,可以帮助改善执行时间(当然,一旦修复)。

请注意,两个嵌套循环意味着 O(N * M)的复杂性,其中 N a M <的长度/ em>是B的长度 因为你正在使用整数,如果你可以接受为一个集合花费几个字节的空间( O(N)),你可以将复杂性降低到 O(N + M)
而且,整个代码在我看来更容易理解:

#include<iostream> 
#include<unordered_set>

int main() {
    int a[8] = { 1, 2, 3, 6, 4, 8, 12, 5 }; 
    int b[6] = { 1, 3, 12, 5, 9, 10 };

    std::unordered_set<int> check{a, a+8};

    for(int j=0; j<6; j++) {
        if(check.find(b[j]) != check.cend()) {
            std::cout << "Yes" << std::endl;
        } else {
            std::cout << "NO" << std::endl;
        }
    }
}

基本理念是:

  • 迭代a并将所有值放入您的设置
  • 迭代b并检查该集是否包含_i-th_value

对于a中的每个值,第二步不再需要迭代b。因此,整体复杂性降低(至少在平均情况下 - 请参阅std::unordered_set的文档以获取更多详细信息。)

答案 3 :(得分:1)

更多C ++方法是使用std::find(C ++ 11内部):

#include <algorithm>
#include <iostream>

int main()
{
    int a[8] = { 1, 2, 3, 6, 4, 8, 12, 5 };
    int b[6] = { 1, 3, 12, 5, 9, 10 };

    for (auto bi : b)
    {
        bool found = std::find(std::begin(a), std::end(a), bi) != std::end(a);
        std::cout << (found ? "Yes" : "No") << '\n';
    }
}

答案 4 :(得分:0)

我在你的程序中做了改变,它给出了预期的输出。

  for (int i = 0; i < 6; i++)
    {
        int flag = 0;
        for(int j=0;j<8;j++)
        {
            if(b[i]==a[j]) // take b array value and compare with all elements of a.
            {
                cout<<"Yes"<<endl;
                flag = b[i];
                break;
            }
        }
        if (b[i] != flag)
            cout<<"NO"<<endl;            
    }