一个算法题,想问一下改进前后的速度差异为什么这么大

DestinedToDie 2019-08-04 03:31:29
代码等一下发,运行限制要求时1s内,改进前超时了,改进后在0.021s到0.038s内,改进仅仅是把用于存储输入的临时数组取消了。
...全文
87 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
盲茫忙// 2019-08-05
  • 打赏
  • 举报
回复
你那个“while (1)”如果ch不是太多”(”或”)”应该不会怎么用到temp数组和那一堆需要cpu判断的语句,只是判断下是不是回车…改前最多也就4个判断改后3个,还有临时数组应该不至于时间差距那么大。确定一下测试值是否一致,测试时有没有其它应用占用资源。再多的我没看,也许也看不出来
636f6c696e 2019-08-05
  • 打赏
  • 举报
回复
没有缩进,命名乱搞的代码没人有兴趣帮你解答问题
DestinedToDie 2019-08-04
  • 打赏
  • 举报
回复
我再说一下我们的思路。读取括号串时先将单串内部的成对括号消除掉,然后计算其左右括号分别的个数,让相应的中的组里对应位置加1表示计数。 处理完所有串后,将所得的数组两两对应。
DestinedToDie 2019-08-04
  • 打赏
  • 举报
回复
引用 3 楼 qq_18298599的回复:
粗略一看,乱!我这个小白非常确定能看得懂这个程序,懒得分析。7小时没人回复是有原因的,不要站在自己的角度写文章,看到这长长的一篇已经对本文提不起兴趣了……思路还要自己分析…
哈哈,您说得对,我们写的注释不够,命名也不规范,显得表述不是很清晰,还望见谅。
盲茫忙// 2019-08-04
  • 打赏
  • 举报
回复
粗略一看,乱!我这个小白非常确定能看得懂这个程序,懒得分析。7小时没人回复是有原因的,不要站在自己的角度写文章,看到这长长的一篇已经对本文提不起兴趣了……思路还要自己分析…
DestinedToDie 2019-08-04
  • 打赏
  • 举报
回复
测试用例刚才没截到
DestinedToDie 2019-08-04
  • 打赏
  • 举报
回复
改进前:
#include <stdio.h>
#include <string.h>
int main(void){
int T =0;
scanf("%d",&T); //输入行数
getchar(); //把输入T时候的那个回车读掉
int xx=0; //输出结果
int max=0,min=100200;
int ZHengKuoHao[100100]={0}; //下标代表预处理后左括号的数目,相应的这个数组元素的值为有ZHengKuoHao[i]行经过预处理之后有i个(
int FuKuoHao[100100]={0}; //同上 这个为)
int WanJinYou=0;
for(int i=0;i<T;i++){
int count=0; //这个是我读取输入的时候把预处理之后的输入存进temp数组的下标
int temp[100020]={0};
int zlen=0;
int flen=0;
while(1){ //这是候开始边读取一行的输入,边进行预处理,每读取一个元素仅与前面一个元素相比较
char ch=0;
scanf("%c",&ch);
if(ch=='(') {
temp[count++]=-1;
flen++;
}
else if(ch==')') {
if(count>0){ //如果形成了一个相邻的合法的括号,那么下标count往前移一位,表示当前读取位与前面一位为合法括号所以可以消除了
if(temp[count-1]==-1){
flen--;
count--;
temp[count]=0;
}
else{
temp[count++]=1;
zlen++;
}
}
else {
temp[count++]= 1;
zlen++;
}
}

else if(ch=='\n') break;
}
if(max<flen) max=flen;
if(max<zlen) max=zlen;
if(min>flen) min=flen;
if(min>zlen) min=zlen;
if(zlen==0&&flen==0) WanJinYou++;
else if(zlen==0&&flen>0) FuKuoHao[flen]++;
else if(zlen>0&&flen==0) ZHengKuoHao[zlen]++;
}
for(int i=min;i<=max;i++){
if(FuKuoHao[i]>=ZHengKuoHao[i]) xx+=ZHengKuoHao[i];
else xx+=FuKuoHao[i];
}
xx+=WanJinYou/2;
printf("%d\n",xx);
}
改进后:
#include <stdio.h>
#include <string.h>
int main(void){
int T =0;
scanf("%d",&T); //输入行数
getchar(); //把输入T时候的那个回车读掉
int xx=0; //输出结果
int max=0,min=100200;
int ZHengKuoHao[100100]={0}; //下标代表预处理后左括号的数目,相应的这个数组元素的值为有ZHengKuoHao[i]行经过预处理之后有i个(
int FuKuoHao[100100]={0}; //同上 这个为)
int WanJinYou=0;
for(int i=0;i<T;i++){
int zlen=0;
int flen=0;
while(1){
char ch=0;
scanf("%c",&ch);
if(ch=='(') {
flen++;
}
else if(ch==')') {

if(flen>0) {
flen--;
}
else zlen++;
}

else if(ch=='\n') break;
}
if(max<flen) max=flen;
if(max<zlen) max=zlen;
if(min>flen) min=flen;
if(min>zlen) min=zlen;
if(zlen==0&&flen==0) WanJinYou++;
else if(zlen==0&&flen>0){
if(ZHengKuoHao[flen]>0) {
ZHengKuoHao[flen]--;
xx++;
}
else FuKuoHao[flen]++;
}
else if(zlen>0&&flen==0) {
if(FuKuoHao[zlen]>0){
FuKuoHao[zlen]--;
xx++;
}
else ZHengKuoHao[zlen]++;
}
}
xx+=WanJinYou/2;
printf("%d\n",xx);
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧