如果存在,如何将一个数组的每个元素与另一个元素进行比较,然后打印是,否则为否
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),其中N是a
的长度,M 是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> 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 的索引进行比较