AlmostIncreasingSequence (CodeSignal) - PullRequest
0 голосов
/ 18 марта 2020

Я застрял в этой задаче, и я подумал об алгоритме, который проходит:

bool almostIncreasingSequence(std::vector<int> Sequence)
{
    int counter = 0;
Label:
    std::vector<int>::iterator it = Sequence.begin();
    for (it; it != Sequence.end(); it++)
    {
        if (*(it) >= *(it + 1))
        {
            counter++;
            Sequence.erase(it);
            goto Label;
        }
    }
    return counter <= 1;
}

Но я не знаю, почему вывод не правильный? Что я делаю не так в этом коде?

Вот фотографии задачи:

Part1 Part2

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Извините, я не могу комментировать, мне нужно хотя бы 50 повторений, в любом случае ... это связано с утверждениями Label и goto, я никогда не видел такой реализации, однако удаление метки и goto сработало бы и сделало counter <= 1 : </p>

bool almostIncreasingSequence(std::vector<int> Sequence)
{
    int counter{ 0 };

    std::vector<int>::iterator it = Sequence.begin();
    for (it; it != Sequence.end(); it++)
    {
        if ((it + 1 != Sequence.end()))
            if (*(it) >= *(it + 1))
            {
                ++counter;
            }
    }
    return counter <= 1;
} 

Вот объяснение: оператор goto запрещает приращение оператора for (++ it), другими словами, использование goto пропускает часть приращения. Это то, что я думаю, опять же удачи.

0 голосов
/ 18 марта 2020

Сделайте условие возврата <= 2 и добавьте дополнительный оператор if, чтобы проверить, хотите ли вы go без границ: </p>

bool almostIncreasingSequence(std::vector<int> Sequence)
{
    int counter{ 0 };
Label:
    std::vector<int>::iterator it = Sequence.begin();
    for (it; it != Sequence.end(); it++)
    {
        if ((it + 1 != Sequence.end())) //new if statement here
        if (*(it) >= *(it + 1))
        {
            ++counter;
            Sequence.erase(it);
            goto Label;
        }
    }
    return counter <= 2;
}

надеюсь, что это сработает!

...