(嗯,我的英语不太好):))
我的朋友现在正在学习C ++,他发现了一个我无法解释原因的问题。
第一个代码,它运行超过2000MS
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int ans[2000000];
char a[2000000];
int main()
{
scanf("%s\n",a);
int l=1,r=strlen(a);
for (int i=0;i<strlen(a);i++)
if (a[i]=='l')
ans[r--] = i+1;
else
ans[l++] = i+1;
for (int i=1;i<=strlen(a);i++)
printf("%d\n",ans[i]);
return 0;
}
第二个代码,它运行465MS
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int ans[2000000];
char a[2000000];
int size;
int main()
{
scanf("%s",a);
int l=1,r=strlen(a);
size = r;
for (int i=0;i<strlen(a);i++)
if (a[i]=='l') ans[r--]=i+1;else ans[l++]=i+1;
for (int i=1;i<=size;i++)
printf("%d\n",ans[i]);
return 0;
}
第三代码,它运行超过2000MS
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int ans[2000000];
char a[2000000];
int size;
int main()
{
scanf("%s",a);
int l=1,r=strlen(a);
size = r;
for (int i=0;i<size;i++)
if (a[i]=='l') ans[r--]=i+1;else ans[l++]=i+1;
for (int i=1;i<=strlen(a);i++)
printf("%d\n",ans[i]);
return 0;
}
最后一个代码,运行515MS
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
int ans[2000000];
string a;
int main()
{
cin >>a;
int l=1,r=a.size();
for (int i=0;i<a.size();i++)
if (a[i]=='l') ans[r--]=i+1;else ans[l++]=i+1;
for (int i=1;i<=a.size();i++)
printf("%d\n",ans[i]);
return 0;
}
当输入字符串大小为10 ^ 5
时所以,原因是关于循环的第二个。
我的问题是为什么“strlen”函数和for循环中的print会使代码变得如此之慢?
答案 0 :(得分:0)
当你在循环中使用strlen
函数时,每次循环时都必须执行size
函数。这是一个额外的函数调用,它必须遍历完整的字符串才能找到它的长度。
在{{1}}中缓存长度,意味着每次循环都不需要重做。
所以,没有错误。这是预期的行为。
答案 1 :(得分:0)
通过在循环条件中编写strlen
- 一个 200万次次迭代的循环 - 您将扫描两百万字符串的两百万字符串。当然这需要一些时间!
当您预先计算一次字符串长度时,该延迟就会消失。
此外,您可能会发现在任何情况下,向控制台传输2MB文本的速度都会明显“慢”。