牛客网学习笔记(HJ35 蛇形矩阵)

111 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目来自牛客网的华为机试题库,本题目为简单题

HJ35 蛇形矩阵

描述
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。例如,当输入5时,应该输出的三角形为:

1 3 6 10 15
2 5 9 14
4 8 13
7 12
11

代码

n = int(input())
list1 = []
for i in range(1,n+1):
    list1.append([0]*i)

a = 0    
for i in range(n):
    for j in range(i+1):
        a = a + 1
        list1[i][j]=a

list2 =[]
for i in range(1,n+1):
    tmp = []
    for line in list1:
        if line:
            tmp.append(line.pop())
    list2.append(' '.join(map(str,tmp)))
for i in list2:
    print(i)

解析

看到这个题感觉很难啊,生成的矩阵只知道要生成几行,也不知道具体最后一个数是什么,最开始我的想法是直接生成N个数组,然后按规律填数,但是发现好复杂啊;后来也想过是不是可以直接用一个数学公式计算出来,事实证明这样很复杂。最后看到了别人的解法,感觉好厉害啊! 可以先生成

1
2 3
4 5 6
7 8 9 10

样子的中间值然后再再旋转,就可以得到想要的输出值了
具体过程
1.生成全是0的list1,按照规则补全成

1
2 3
4 5 6
7 8 9 10

2.把每行最后一个数字放一起组成list2的第一行,有一个把得到的数组怎么组合到一起的问题,本来想着再用一个for循环控制输出。后来发现' '.join(map(str,tmp)可以把数字转化成字符串,然后用join连接起来,组成一个字符串。
3.按照倒过来的顺序把list1里的数字都按照步骤2的方法组合到一起
4.最后用一个for循环把list2里的字符串进行输出即可