检查两个数组是否相等??例如:{1,2,3,4,5} == {4,5,3,2,1}
Check if two arrays are equal or not ?? eg: {1,2,3,4,5} == {4,5,3,2,1}
这种方法有什么问题吗?或者还好吗?我们必须判断 2 个数组是否相等
就像它们中的数字一样,无论它们的顺序如何,它们的频率都必须相同。
#include<bits/stdc++.h>
using namespace std;
main(){
int t,n,i,in;
vector<int> x;
cin>>t;
while(t--){
unordered_map<int,int> a,b;
cin>>n;
for(i=0;i<n;i++){
cin>>in;
x.push_back(in);
a[in]++;
}
for(i=0;i<n;i++){
cin>>in;
b[in]++;
}
for(i=0;i<n;i++){
if(b.find(x[i]) == b.end()){
cout<<"0"<<endl;
goto x;
}
if(a[x[i]] != b[x[i]]){
cout<<"0"<<endl;
goto x;
}
}
cout<<"1"<<endl;
x : ;
}
}
我不知道你对 C++ 有多陌生,所以这里有一个可能的解决方案,并附有一些解释。
#include <map>
#include <vector>
#include <iostream>
//Avoid using namespace std as it can cause problems with conflicts of names
//and other sorts of nasty issues
using std::cout;
using std::cin;
using std::map;
using std::vector;
using std::endl;
//By using an ordered map you can more easily compare them
//The arguments are passed as const (you will never modify them)
//and also as reference (&) since you don't need to copy them.
bool CheckIfEqual (const vector<int> & V1, const vector<int> & V2) {
//If the vectors don't have the same size you can just return false
if (V1.size() != V2.size()) {
return false;
}
map <int, size_t> M1;
map <int, size_t> M2;
//This type of loop goes through all elements of the vector and
//either creates a corrisponding value in the map or, if it is
//already present, it increases it to accout for repetitions.
//Map is automatically sorted.
for (auto & Elem : V1) {
M1[Elem]++;
}
for (auto & Elem : V2) {
M2[Elem]++;
}
return M1 == M2;
}
//The main function is used to provide some examples
int main () {
//Expected output: true
vector<int> V1 {1, 2, 3, 4, 5};
vector<int> V2 {1, 2, 3, 4 ,5};
cout << CheckIfEqual(V1, V2) << endl;
//Expected output: true
V1 = {1, 2, 3, 4, 5};
V2 = {5, 3, 2, 1 ,4};
cout << CheckIfEqual(V1, V2) << endl;
//Expected output: false
V1 = {1, 2, 3};
V2 = {5, 3};
cout << CheckIfEqual(V1, V2) << endl;
//Expected output: false
V1 = {1, 2, 3, 4, 5};
V2 = {5, 3, 2, 1 ,1};
cout << CheckIfEqual(V1, V2) << endl;
//Expected output: true
V1 = {1, 5, 5, 4, 5};
V2 = {5, 5, 5, 1 ,4};
cout << CheckIfEqual(V1, V2) << endl;
}
输出为
1
1
0
0
1
另外请在使用goto
时非常非常小心,它已被弃用,仅在您需要一次跳出多个嵌套循环时才有用。一个简单的 break
会更好。
这种方法有什么问题吗?或者还好吗?我们必须判断 2 个数组是否相等 就像它们中的数字一样,无论它们的顺序如何,它们的频率都必须相同。
#include<bits/stdc++.h>
using namespace std;
main(){
int t,n,i,in;
vector<int> x;
cin>>t;
while(t--){
unordered_map<int,int> a,b;
cin>>n;
for(i=0;i<n;i++){
cin>>in;
x.push_back(in);
a[in]++;
}
for(i=0;i<n;i++){
cin>>in;
b[in]++;
}
for(i=0;i<n;i++){
if(b.find(x[i]) == b.end()){
cout<<"0"<<endl;
goto x;
}
if(a[x[i]] != b[x[i]]){
cout<<"0"<<endl;
goto x;
}
}
cout<<"1"<<endl;
x : ;
}
}
我不知道你对 C++ 有多陌生,所以这里有一个可能的解决方案,并附有一些解释。
#include <map>
#include <vector>
#include <iostream>
//Avoid using namespace std as it can cause problems with conflicts of names
//and other sorts of nasty issues
using std::cout;
using std::cin;
using std::map;
using std::vector;
using std::endl;
//By using an ordered map you can more easily compare them
//The arguments are passed as const (you will never modify them)
//and also as reference (&) since you don't need to copy them.
bool CheckIfEqual (const vector<int> & V1, const vector<int> & V2) {
//If the vectors don't have the same size you can just return false
if (V1.size() != V2.size()) {
return false;
}
map <int, size_t> M1;
map <int, size_t> M2;
//This type of loop goes through all elements of the vector and
//either creates a corrisponding value in the map or, if it is
//already present, it increases it to accout for repetitions.
//Map is automatically sorted.
for (auto & Elem : V1) {
M1[Elem]++;
}
for (auto & Elem : V2) {
M2[Elem]++;
}
return M1 == M2;
}
//The main function is used to provide some examples
int main () {
//Expected output: true
vector<int> V1 {1, 2, 3, 4, 5};
vector<int> V2 {1, 2, 3, 4 ,5};
cout << CheckIfEqual(V1, V2) << endl;
//Expected output: true
V1 = {1, 2, 3, 4, 5};
V2 = {5, 3, 2, 1 ,4};
cout << CheckIfEqual(V1, V2) << endl;
//Expected output: false
V1 = {1, 2, 3};
V2 = {5, 3};
cout << CheckIfEqual(V1, V2) << endl;
//Expected output: false
V1 = {1, 2, 3, 4, 5};
V2 = {5, 3, 2, 1 ,1};
cout << CheckIfEqual(V1, V2) << endl;
//Expected output: true
V1 = {1, 5, 5, 4, 5};
V2 = {5, 5, 5, 1 ,4};
cout << CheckIfEqual(V1, V2) << endl;
}
输出为
1
1
0
0
1
另外请在使用goto
时非常非常小心,它已被弃用,仅在您需要一次跳出多个嵌套循环时才有用。一个简单的 break
会更好。