HackerRank Большая сортировка Сегментация Ошибка в C ++ - PullRequest
0 голосов
/ 07 февраля 2020

У меня вопрос о задаче BigSorting от HackerRank.

Мой код успешно выполняет все тесты, кроме 3. (Я обнаружил файлы, на которых моя программа не работает, под именами input03.txt, input04.txt и input05.txt на моем диске Google. Вот ссылка на привод.) https://drive.google.com/drive/u/1/folders/1psno2RbeYXX5ohHjs5BWke6E-K2cJl-3

Моя программа аварийно завершает работу с ошибкой «Ошибка сегментации». Я сижу 2 часа и не могу понять, в чем ошибка. Это мой первый вопрос по StackOverflow, поэтому я сразу же извиняюсь, если сделал что-то не так.

Вот код.

#include <vector>
#include <string>
#include <iostream>
#include <algorithm>

bool isShorter(const std::string& s1, const std::string& s2)
{
    if (s1.size() != s2.size())
    {
        return s1.size() < s2.size();
    }
    else
    {
        for (int i = 0; i < s1.size(); ++i)
        {
            int x = s1[i] - '0';
            int y = s2[i] - '0';
            if (x != y)
            {
                return x < y;
            }
        }
    }   
    return true;
}

std::vector<std::string> bigSorting(std::vector<std::string> unsorted) 
{
    std::sort(unsorted.begin(), unsorted.end(), isShorter);
    return unsorted;
}

1 Ответ

2 голосов
/ 07 февраля 2020

Функция, заданная для std::sort, должна вызывать строгое слабое упорядочение элементов в диапазоне итераторов, см. std::sort, Сравнить требования и строгий слабый порядок в Википедии .

Ваш isShorter вызывает порядок, который не является строгим. В частности, он не обладает свойством, которое isShorter(x, x) == false для всех x.

. Проблема в том, что вы возвращаете true, когда не можете найти ни одну строку до или после другой в заказе, но вы должны вернуть false.

Функция должна моделировать <, а не <=.

Неясно, является ли это причиной ошибки сегментации, поскольку вы не t приведен пример полного кода, но нарушение требований std::sort приводит к неопределенному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...