优化整数序列的非递归算法
optimizing a non recursive algorithm of an integer sequence
在招聘测试平台上,我有以下整数序列问题,我没有使用递归函数来解决它以避免 Stack Overflow :
这里是问题的简短描述:
我们有一个标记,在每个阶段我们都会前进或后退。
在第 0 阶段,我们处于位置 0(没有步骤)
在第 1 阶段,我们向前迈出一步(+1 步)=> 位置 1
对于第 2 阶段,我们向后退两步(-2 步)=> 位置 -1
对于阶段 n :我们在前一阶段采取的步数减去我们在倒数第二阶段采取的步数,因此在阶段 3 中,我们将不得不向后采取 3 步 (-2 - 1)。 =>位置-4
等...
目标是将函数 int getPos(int stage) 写入指定阶段的 return 位置。
我用笔和纸找到了这个公式:
位置(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 case的最大值超时,测试平台说我的解决方案优化不够,无法处理某些情况。
我尝试了 "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步,...
因此,对于步骤 x,答案是步骤 (x%6)
你可以做到
cout << "Pos at stage x = " << getPos((x%6)) << endl;
在招聘测试平台上,我有以下整数序列问题,我没有使用递归函数来解决它以避免 Stack Overflow :
这里是问题的简短描述:
我们有一个标记,在每个阶段我们都会前进或后退。 在第 0 阶段,我们处于位置 0(没有步骤) 在第 1 阶段,我们向前迈出一步(+1 步)=> 位置 1 对于第 2 阶段,我们向后退两步(-2 步)=> 位置 -1 对于阶段 n :我们在前一阶段采取的步数减去我们在倒数第二阶段采取的步数,因此在阶段 3 中,我们将不得不向后采取 3 步 (-2 - 1)。 =>位置-4 等...
目标是将函数 int getPos(int stage) 写入指定阶段的 return 位置。
我用笔和纸找到了这个公式:
位置(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 case的最大值超时,测试平台说我的解决方案优化不够,无法处理某些情况。
我尝试了 "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步,...
因此,对于步骤 x,答案是步骤 (x%6)
你可以做到
cout << "Pos at stage x = " << getPos((x%6)) << endl;