【问题标题】:Check if two arrays are equal or not检查两个数组是否相等
【发布时间】:2020-02-12 00:33:06
【问题描述】:

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

    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。

【问题讨论】:

  • 您不希望生成的地图为空;您要检查它是否仅包含 0。请记住,如果第二个数组中有一个根本不在第一个数组中的值会发生什么。
  • 只需使用std::is_permutation
  • @BoBTFish 你是对的,但从技术上讲,这不会导致问题,因为所有映射条目的总和必须为零(如果 M==N)。因此,如果由于此错误而缺少负条目,则某处必须有正条目,从而导致总体正确的结果。
  • 对两者进行排序,然后检查它们是否相等。

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


【解决方案1】:

你正在寻找std::is_permutation:

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

我冒昧地将您的函数返回更改为 bool 并将 std::vectors 作为函数参数,因为这是 C++ 而不是 C。

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

【讨论】:

  • 您需要在调用std::is_permutation 之前检查大小是否相等,以避免未定义的行为。
  • @Fareanor 其实我认为他们不必相等,只要arr1.size() &lt;= arr2.size()
  • @nada 是的,但您需要确保这一点。而且由于该函数应该验证相等性,因此在调用 std::is_permutation 之前检查大小是否相等是有意义的(避免在不需要时调用该函数 --> 节省时间)。
  • @HeetMehta 如果此答案解决了您的问题,请考虑accepting it
  • 通过arr2.end() 也可以轻松实现“相同大小”检查。请参阅链接的文档。这个解决方案仍然是单线的。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    ump[arr2[i]]--; 不会删除密钥。您必须检查每个条目的值是否为零。我在return 1 之前添加了以下语句-

    for (auto it = ump.begin(); it != ump.end(); ++it ) if(it-&gt;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;
    }
    

    【讨论】:

      【解决方案4】:

      您需要检查地图中的每个键的值是否为零。您可以使用以下代码代替ump.empty()

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        • 2015-08-21
        • 1970-01-01
        • 2020-09-16
        • 1970-01-01
        相关资源
        最近更新 更多