【发布时间】:2017-08-24 09:08:59
【问题描述】:
我的大部分代码都面临类似的问题。我该如何解决?
这里的问题:http://usaco.org/index.php?page=viewproblem2&cpid=692
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
string rotate_s(string s){
int m= s.size();
string s2;
for(int i=0; i<m; i++){
s2[i] = s[(i+m-1)%m];
}
return s+s2;
}
int main()
{
string s;
int n;
cin>>s>>n;
int k = s.size();
while(k<n){
s = rotate_s(s);
k = s.size();
}
cout<<s[n-1]<<endl;
return 0;
}
【问题讨论】:
-
您显示的代码有undefined behavior。当你定义一个
std::string对象(例如s2在你的rotate_s函数中)时,它以empty 开始。这意味着对该字符串对象的任何索引都将超出范围。如果您有 UB(未定义行为),那么您的整个程序是格式错误且无效的,任何关于其行为或问题的猜测都将变得毫无意义。 -
除了修复上面提到的UB,我建议重新考虑你的算法。
rotate_s函数非常昂贵(时间和内存),所以我建议考虑如何减少它的调用次数。 -
“N 可能太大,无法放入标准的 32 位整数”。这让您真的认为您不必构建结果字符串,而只需从原始字符串中“计算”要使用的索引。
-
什么是“TLE”?
-
@Ian: Too Long E执行。
标签: c++ debugging c++14 time-limiting