检查两个数组是否相等

时间:2019-10-15 10:41:42

标签: c++ arrays algorithm equality unordered-map

我试图知道两个给定的数组是否相等,与元素的排列无关,但包含相同的元素,并且所有元素的频率必须相同。

    int SameArray(int arr1[], int arr2[], int N, int M)
    {
        unordered_map<int, int> ump;
        if(N == M)
        {
            for(int i = 0; i < N; i++)
            {
                ump[arr1[i]]++;
            }
            for(int i = 0; i< M; i++)
            {
                if(ump.find(arr2[i]) != ump.end())
                    ump[arr2[i]]--;
            }
            if(ump.empty())
            return 1;
        }
        return 0;
    }

它没有显示任何错误,但输出始终为0。

4 个答案:

答案 0 :(得分:7)

您正在寻找std::is_permutation

bool SameArray(std::vector<int> arr1, std::vector<int> arr2) {
    return std::is_permutation(arr1.begin(), arr1.end(), arr2.begin(), arr2.end());
}

我自由地将您的函数更改为bool并将std::vector作为函数参数,因为它是C ++而不是C。

如果您对std::permutation的比较如何工作感到好奇,请查看其example implementation

答案 1 :(得分:4)

if语句中的条件

if(ump.empty())

不正确。如果传递的数组的大小不为零,则映射不能为空。

您可以使用标准算法std::all_of代替条件。同样,传递数组的两个大小也没有意义,因为如果它们彼此不相等,则很明显数组不相等。

此外,数组参数还应使用限定符const进行指定,因为它们在函数中未更改。

这里是一个演示程序,显示了如何定义函数。

#include <iostream>
#include <iomanip>
#include <unordered_map>
#include <iterator>
#include <algorithm>

bool SameArray( const int a1[], const int a2[], size_t n )
{
    sstd::unordered_map<int, int> m;

    for ( const int *p = a1; p != a1 + n; ++p ) ++m[*p];
    for ( const int *p = a2; p != a2 + n; ++p ) --m[*p];


    return std::all_of( std::begin( m ), std::end( m ), 
                        []( const auto &p) { return p.second == 0; } );
}

int main() 
{
    const size_t N = 20;

    int a1[N] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    int a2[N] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    std::cout << std::boolalpha << SameArray( a1, a2, N ) << '\n';

    return 0;
}

其输出为

true

答案 2 :(得分:1)

您需要检查映射中的每个键的值是否均为零。您可以执行以下代码来代替ump.empty()

for (auto& it: ump) {
    if(it.second != 0) {
        return 0;
} 
return 1;

答案 3 :(得分:1)

ump[arr2[i]]--;不会删除密钥。您必须检查每个条目的值是否为零。我在return 1-

之前添加了以下语句

for (auto it = ump.begin(); it != ump.end(); ++it ) if(it->second != 0) return 0;

int SameArray(int arr1[], int arr2[], int N, int M)
{
    unordered_map<int, int> ump;
    if(N == M)
    {
        for(int i = 0; i < N; i++)
        {
            ump[arr1[i]]++;
        }
        for(int i = 0; i< M; i++)
        {
            if(ump.find(arr2[i]) != ump.end())
                ump[arr2[i]]--;
        }
        for (auto it = ump.begin(); it != ump.end(); ++it ) if(it->second != 0) return 0; 
        return 1;
    }
    return 0;
}