📜  门| GATE CS 2013 |问题12(1)

📅  最后修改于: 2023-12-03 14:58:19.903000             🧑  作者: Mango

门 | GATE CS 2013 |问题12

本题要求您编写一个程序,该程序接受一个整数 n 作为输入,并输出一个由 2n 个“门”符号(“|”)和 n 个“-”符号组成的字符串。其中,门符号按如下规则组成:

  • 第一行和最后一行各有 n 个门符号;
  • 中间有 n 行,每行的门符号数量从 1 个到 n 个逐渐增加,然后再逐渐减少到 1 个。

例如,当 n=3 时,输出结果应该为:

|||---|||
||---|||
|-|||
--|
|-|||
||---|||
|||---|||

注意输出的结尾需要有换行符。

输入格式

输入一个整数 n(1 <= n <= 100)。

输出格式

输出一个由 2n 个“门”符号和 n 个“-”符号组成的字符串,符合上述规则。

样例输入
3
样例输出
|||---|||
||---|||
|-|||
--|
|-|||
||---|||
|||---|||
解题思路

这个问题可以分解为两个小问题:

  1. 求中间的门符号数量如何算?
  2. 如何输出符合要求的字符串?

对于第一个问题,我们可以发现中间每行门符号数量是从 1 开始逐渐递增再逐渐递减到 1,因此可以使用双重循环来计算:

for i in range(1, n+1):
    count = i
    for j in range(n, i-1, -1):
        count += 2

对于第二个问题,我们可以结合第一个问题的解答使用两个循环来输出字符串:

for i in range(1, n+1):
    count = i
    for j in range(n, i-1, -1):
        count += 2
        print("|" * count + "-" * (2*n - count*2) + "|" * count)
    
for i in range(n, 0, -1):
    count = i
    for j in range(n, i-1, -1):
        count += 2
        print("|" * count + "-" * (2*n - count*2) + "|" * count)

最终的代码如下:

n = int(input())

for i in range(1, n+1):
    count = i
    for j in range(n, i-1, -1):
        count += 2
        print("|" * count + "-" * (2*n - count*2) + "|" * count)
    
for i in range(n, 0, -1):
    count = i
    for j in range(n, i-1, -1):
        count += 2
        print("|" * count + "-" * (2*n - count*2) + "|" * count)

时间复杂度

我们需要输出 2n 个门符号和 n 个“-”符号,因此时间复杂度为 O(n^2)。

空间复杂度

由于我们没有使用任何额外的数据结构来存储字符串,因此空间复杂度为 O(1)。