Python控制台打印菱形和绕圈圈面试题

1、控制台打印菱形

N = 5        # 其他 N 值也适用
for i in range(N):
    if i==0 :
        print(' '*(N-1) + '*')
    else:
        print(' '*(N-(i+1)) + '*' + (i*2-1)*' ' + '*')
for i in range(N-1):
    if i==N-2:
        print(' '*(N-1) + '*')
    else:
        print(' '*(i+1) + '*' + ((N-2-i)*2-1)*' ' + '*')
    *
   * *
  *   *
 *     *
*       *
 *     *
  *   *
   * *
    *

2、绕圈圈面试题

01 16 15 14 13
02 17 24 23 12
03 18 25 22 11
04 19 20 21 10
05 06 07 08 09

分析

# 打印坐标(索引)信息
SIZE = 5
for i in range(SIZE):
    for j in range(SIZE):
        print('%d%d' % (i, j), end=' ')
    print('')

00 01 02 03 04
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
40 41 42 43 44

对应转弯图:
在这里插入图片描述
说明

  • 1 号转弯线:行索引 + 列索引 = SIZE - 1

    下半区(左转):行索引 > 列索引

    上半区(右转):行索引 < 列索引

  • 2 号转弯线:行索引 = 列索引

    下半区(向上):行索引 >= SIZE / 2(SIZE 为奇数大于,偶数时可等于)

  • 3 号转弯线:行索引 + 1 = 列索引

    上半区(向下):列索引 < SIZE / 2

SIZE = 5      # 适用于其他值

# 构建列表
array = [[0]*SIZE] 
for i in range(SIZE-1):
    array += [[0]*SIZE] 

# 赋值列表
orient = 1       # 控制方向 0:向上,1:向下,2:向左,3:向右
H, L = 0, 0      # H 控制行号,L 控制列号
for i in range(1, SIZE*SIZE+1):
    array[H][L] = i
    
    if H+L==SIZE-1:
        if H>L:
            orient = 3
        else:
            orient = 2
    elif H==L and H>=SIZE/2:
        orient = 0
    elif H+1==L and L<SIZE/2:
        orient = 1
        
    if orient==0:
        H -= 1
    elif orient==1:
        H += 1
    elif orient==2:
        L -= 1
    elif orient==3:
        L += 1
        
# 打印列表
for ele in array:    
    for e in ele:
        print('%02d' % e, end=' ')
    print('')

01 16 15 14 13
02 17 24 23 12
03 18 25 22 11
04 19 20 21 10
05 06 07 08 09

注意:

SIZE = 5

# 构建列表
array = [[0]*SIZE] 
array *= 2       # 第二个列表为第一个列表浅拷贝的副本,没有真正把第一个列表复制,只拷贝了引用
print(array)

array[0][0] = 3  # 此处赋值给第一个列表时,导致第二个列表的相应位置也随之更改(给第二个列表赋值同理)
print(array)

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

[[3, 0, 0, 0, 0], [3, 0, 0, 0, 0]]

猜你喜欢

转载自blog.csdn.net/qq_36512295/article/details/94040596