оптимизация нерекурсивного алгоритма целочисленной последовательности

В тестовой платформе рекрутинга у меня была следующая проблема целочисленной последовательности, которую я решал без рекурсивной функции, чтобы избежать переполнения стека:

Вот краткое описание проблемы:

У нас есть отметка, и на каждом этапе мы будем двигаться вперед или назад.
На этапе 0 мы находимся в позиции 0 (без шагов)
На этапе 1 мы делаем один шаг вперед (+1 шаг) => позиция 1
Для этапа 2 мы делаем два шага назад (-2 шага) => позиция -1
Для этапа n: количество шагов, которые мы сделали на предыдущем этапе, минус количество шагов, которые мы предприняли на втором-последнем этапе, поэтому на этапе 3 нам придется сделать 3 шага назад (-2 — 1). => позиция -4
так далее…

Цель состоит в том, чтобы написать функцию int getPos (int stage) для возврата позиции на указанном этапе.

с ручкой и бумагой я нашел эту формулу:

позиция (n) = шаги (n-1) — шаги (n-2) + позиция (n-1)

и вот мое решение

#include <iostream>

using namespace std;

int getPos(int stage)
{
if (stage < 2)
return stage;

if (stage == 2)
return -1;

int stepNMinus1 = -2;
int stepNMinus2 = 1;
int stepN = 0;
int posNMinus1 = -1;
int Res = 0;

while (stage-- > 2)
{
stepN = stepNMinus1 - stepNMinus2;
Res = stepN + posNMinus1;
stepNMinus2 = stepNMinus1;
stepNMinus1 = stepN;
posNMinus1 = Res;
}

return Res;
}

int main()
{
cout << "Pos at stage -1 = " << getPos(-1) << endl; // -1
cout << "Pos at stage 0 = " << getPos(0) << endl; // 0
cout << "Pos at stage 1 = " << getPos(1) << endl; // 1
cout << "Pos at stage 2 = " << getPos(2) << endl; //-1
cout << "Pos at stage 3 = " << getPos(3) << endl; // -4
cout << "Pos at stage 4 = " << getPos(4) << endl; // -5
cout << "Pos at stage 5 = " << getPos(5) << endl; // -3
cout << "Pos at stage 100000 = " << getPos(100000) << endl; // -5
cout << "Pos at stage 2147483647 = " << getPos(2147483647) << endl; // 1
}

После выполнения тестовой программы с помощью теста платформы максимальное значение для случая int истекло, и тестовая платформа заявила, что мое решение недостаточно оптимизировано для обработки некоторых случаев.

Я попробовал ключевое слово «register», но оно не имеет никакого эффекта …

Мне действительно любопытно, и я хочу знать, как написать оптимизированную функцию. Должен ли я изменить алгоритм (как?) Или использовать некоторые настройки компилятора?

-2

Решение

Мы напишем первые этапы

Stage    | Step   | Position
0        | 0      | 0
1.       | 1      |1
2        |-2      | -1
3        |-3      |-4
4        |-1      |-5
5        |2       |-3
6        |3       |0
7        |1       |1
8        |-2      |-1

Мы видим, что на шаге 6 равен шагу 0, шаг 1 = шаг 7, шаг 2 = шаг 7, …

Таким образом, для шага х ответ является шагом (х% 6)

Ты можешь сделать

cout << "Pos at stage x = " << getPos((x%6)) << endl;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]