【发布时间】:2021-08-19 00:28:51
【问题描述】:
上周我接受了一次采访。他们让我写一个这样打印的代码
input :5
0
101
21012
3210123
432101234
54321012345
我写了下面的代码,但他说我可以进一步优化。我想不通。 ,
int main(){
int n,i,j,k,lim,num;
scanf("%d",&n);//getting input starting number of last row
lim=n;
int collen=n+2;//it denotes end of row
for(i=0;i<n+1;i++)
{
num=i;
k=0;
for(j=0;j<collen-1;j++){
if(j<lim)
printf(" ");
else if(num<0){
printf("%d",++k);
}
else{
printf("%d",num--);
}
}//j for
printf("\n");
collen++;
lim--;
}//i for
}// main end
我第一次尝试有不同的代码,我使用 flag 来检测 num 何时达到递增和递减,这很复杂,在第二个循环中大约有 4 个,所以我优化了上面的代码。他说你能再优化一下吗?我不知道优化它。
我的问题:可以优化吗?如果可以 - 请发布代码
【问题讨论】:
-
一写
scanf,你就没有通过面试。那是一个命令行参数。 -
在我看来,这里天生就有四个循环:(1) 一个从 0 到 5 的循环,每行一个),(2) 一个循环将空格打印到一个开头行,(3)循环打印从三角形左边缘到中间的递减数字,以及(4)循环打印从中间到右边缘的递增数字。因此,如果我看到一个有四个循环的解决方案,也许还有三个变量(一个“最大”数,这里是 5,还有两个计数器,因为循环是嵌套的),那感觉“恰到好处”。您也许可以用“更少”的方式侥幸逃脱,但这将以不自然、增加复杂性为代价。
-
@SteveSummit 您不需要数字循环,只需在开头的某处使用
char *digits = "0123456789";。 -
我们都不知道具体的任务是什么。您如何确定要求?
标签: c optimization time-complexity