【问题标题】:Optimize code to get following output in c优化代码以在 c 中获得以下输出
【发布时间】: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


【解决方案1】:
  1. for 循环比&lt; 比较的循环要多。 for(i=0;i&lt;n+1;i++) 写成for (i = 0; i &lt;= n; i++) 更清晰。
  2. 如果你初始化一个值,例如int collen=n+2;,然后像collen-1一样使用它,保存减法并调整初始化。
  3. 将这个复杂的内部循环与ifs 分离到它们自己的循环中。
  4. 使用更少的变量。
  5. 使用更多且一致的空格。

现在是我的解决方案,但和你一样,它只能处理从 0 到 9 的输入:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n;

    printf("input :");
    if (scanf("%d", &n) != 1 || n < 0 || n > 9) {
        printf("input not recognized or invalid\n");
        return EXIT_FAILURE;
    }

    for (int i = 0; i <= n; ++i) {
        printf("%*d", n - i + 1, i);
        for (int j = i - 1; j >= 0; --j) {
            printf("%d", j);
        }
        for (int j = 1; j <= i; ++j) {
            printf("%d", j);
        }
        printf("\n");
    }
    return EXIT_SUCCESS;
}

【讨论】:

    【解决方案2】:

    这看起来优化到了边缘:

    int main( int argc, char **argv )
    {
        puts( "input :5");
        puts( "     0");
        puts( "    101");
        puts( "   21012");
        puts( "  3210123");
        puts( " 432101234");
        puts( "54321012345");
    }
    

    【讨论】:

    • 如果你使用puts,你不需要包含\n,但是使用printf你确实需要它。
    • no input is the number number to start print in last row
    • @jasinthpremkumar 在这里!
    • 。它只为输入 5 打印。它不会为其他输入,如 6 , 2 个数字
    • 您错过了只输出一个字符串的机会。 -1
    【解决方案3】:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    /* Print a pyramid */
    
    int
    main(int argc, char **argv)
    {
            int size = argc > 1 ? strtol(argv[1],NULL,10) : 5;
            if( size > 9 || size < 0) {
                    fprintf(stderr, "Invalid size\n");
                    return EXIT_FAILURE;
            }
            for(int line = 0; line <= size; line++) {
                    char template[]="9876543210123456789";
                    char *s = template + 9 - size;
                    template[10 + line] = '\0';
                    memset(s, ' ', size - line);
    
                    if(puts(s) == EOF) {
                            perror("puts");
                            return EXIT_FAILURE;
                    }
            }
            return EXIT_SUCCESS;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      相关资源
      最近更新 更多