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

Posted

技术标签:

【中文标题】如果存在,如何将一个数组的每个元素与另一个元素进行比较,然后打印是,否则为否【英文标题】:How to compare each element of one array to another if present then print Yes otherwise no 【发布时间】:2017-01-29 05:33:35 【问题描述】:
#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 else no . 我得到的输出为

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

我必须得到这样的输出

yes
yes
yes
yes
No
No

【问题讨论】:

您的程序是用 C++ 编写的,而不是用 C 编写的。由于它们是两种不同的语言,请正确标记您的问题。此外,糟糕的缩进使得很难看出哪些语句属于哪个循环。 先生,请您写 sudo 代码。我是编程新手,我没有得到你。 没有sudo代码,是伪代码。 :) 【参考方案1】:

这里要提到的主要一点是,一旦找到匹配项,您需要将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;
 

【讨论】:

加上反转 for 循环。 @O'Neil 有必要吗? @SouravGhosh 如果他们只想要六个输出结果而不是八个。 @SouravGhosh 据我了解,目的是确定b的每个元素是否在a中。 现在应该是标准杆了。【参考方案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

【讨论】:

【参考方案3】:

其他答案已经给出了您破坏算法的原因。我想给你一个提示,可以帮助在执行时间方面改进它(当然,一旦固定)。

注意,两个嵌套循环意味着复杂度O(N*M),其中Na的长度,MB 的长度。 对于您正在使用整数,如果您可以接受为一个集合花费几个字节的空间 (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> checka, 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

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

【讨论】:

【参考方案4】:

更多的 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';
    

【讨论】:

【参考方案5】:

我确实对您的程序进行了更改,它给出了预期的输出。

  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;            
    

【讨论】:

以上是关于如果存在,如何将一个数组的每个元素与另一个元素进行比较,然后打印是,否则为否的主要内容,如果未能解决你的问题,请参考以下文章

将数组的一个元素与另一个数组元素进行比较

如何使用 Javascript 将元素的内部 HTML 文本替换为数组的一部分

核心数据谓词 - 检查数组中的任何元素是不是与另一个数组中的任何元素匹配

将一个数组中的数字与另一个数组 Javascript 的索引进行比较

如何迭代列表中的每个元素并将其与另一个元素相加以找到一个数字?

将数组元素与另一个数组合并,该数组是 mongo 集合的一部分