В тестовой платформе рекрутинга у меня была следующая проблема целочисленной последовательности, которую я решал без рекурсивной функции, чтобы избежать переполнения стека:
Вот краткое описание проблемы:
У нас есть отметка, и на каждом этапе мы будем двигаться вперед или назад.
На этапе 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», но оно не имеет никакого эффекта …
Мне действительно любопытно, и я хочу знать, как написать оптимизированную функцию. Должен ли я изменить алгоритм (как?) Или использовать некоторые настройки компилятора?
Мы напишем первые этапы
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;
Других решений пока нет …