在执行中显示数字金字塔

时间:2014-01-28 16:46:26

标签: algorithm data-structures

我们如何在O(n)执行时打印以下内容 可能正在使用单个for循环?

1
2 3
4 5 n

最多n行 我所能做的就是使用嵌套for循环

2 个答案:

答案 0 :(得分:1)

嵌套for循环并不一定意味着它不再是O(n)。如果嵌套循环中的内容被执行O(n)次,那么嵌套循环就完全可以了:

cur_num <- 1
cur_step <- 1
while cur_num <= n
    for i <- 1 to cur_step
        print cur_num++
    cur_step++
    print '\n'

使用单个for循环,它可行,但稍微不那么愉快

cur_num <- 1
cur_step <- 1
cur_step_consumed <- 0
for i <- 1 to n
    print cur_num++
    cur_step_consumed++
    if cur_step_consumed == cur_step
         cur_step_consumed <- 0
         cur_step++
         print '\n'

答案 1 :(得分:0)

在C ++中:

size_t amount = 1;
size_t count = 0;
for(size_t i=1;i<=n;++i){
   cout << i << " ";
   ++count;
   if (count == amount){
      cout << endl;
      count = 0;
      ++amount;
   }
}

输出n = 29:

1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
29

我们的想法是跟踪当前行中要打印的元素数量,并跟踪当前行中打印的元素数量。当我们为当前行打印的元素数量与要为该行打印的元素总数相同时,重置计数并增加要为下一行打印的元素数量。你可以搞乱格式化以获得更漂亮的输出,但这是在O(n)时间和O(1)空间中如何完成它的要点。