Проверьте, равны ли два массива или нет - PullRequest
2 голосов
/ 15 октября 2019

Я пытаюсь узнать, равны ли два данных массива, независимо от перестановки элементов, но содержит одинаковые элементы, и частота всех элементов должна быть одинаковой.

    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 ]

7 голосов
/ 15 октября 2019

Вы ищете 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 s в качестве параметров функции, поскольку это C ++, а не C.

Если вам интересно, как работает сравнение std::permutation, посмотрите на пример реализации .

4 голосов
/ 15 октября 2019

Условие в операторе 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
1 голос
/ 15 октября 2019

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;
}
1 голос
/ 15 октября 2019

Вам необходимо проверить, имеет ли каждый ключ на карте значение ноль. Вместо ump.empty() вы можете сделать следующий код:

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