本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目来自牛客网的华为机试题库,本题目为简单题
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里的字符串进行输出即可