看到这条网友爆料的时候,我真的是忍不住笑了。
不知道大家有没有遇到过这种情况,刚听到自己被降薪10%,主管一脸“安慰”你:“别着急,降薪总比裁员好。”两个月后,主管突然被降薪25%,他说自己“每个月房贷要5000多”,听着简直要笑掉大牙了。
说实话,在这个行业里,降薪真的不是什么新鲜事。尤其是在公司业绩下滑,或者外部环境不好时,我们这些码农也往往成为“第一波”被调整的对象。
可这些领导,你能说服下属,咋就说服不了自己呢?
说起来,房贷5000多,真是让人心疼,感觉突然自己也有点“同情”那位主管了。😅
算法题:对角线遍历
今天咱们聊一个看似简单但有点意思的算法问题:对角线遍历。
首先,咱们得理清楚题目要求:你有一个二维矩阵,题目要求你按对角线的方式来遍历这个矩阵。那么,这个“对角线遍历”到底是怎么回事呢?
简单来说,对角线遍历就是从左上角开始,沿着每一条对角线进行遍历。举个例子:
如果给你一个 3x3 的矩阵:
1 2 3
4 5 6
7 8 9
你按照对角线遍历的顺序,应该是这样:
1
2 4
3 5 7
6 8
9
从上面的矩阵来看,第一条对角线是只有一个元素的 1,第二条对角线是 2 和 4,第三条对角线是 3、5 和 7,依此类推。
思路:先考虑遍历顺序
既然是“对角线”,那么就意味着我们要从每个对角线的起点开始,逐一遍历。从上到下,左到右的顺序,遍历每一条对角线。
核心步骤:
按对角线的顺序,从左上角开始遍历。 每条对角线的起始位置,可以通过横纵坐标之和确定。 对于每一条对角线,元素的访问顺序是从左到右进行的。
对于这个问题,最简单的方法就是使用两个循环。一个循环遍历从左上到右上部分的对角线,另一个循环遍历从左下到右下的对角线。
代码实现
来看一段 Python 代码,具体实现对角线遍历:
def findDiagonalOrder(matrix):
if not matrix:
return []
# 获取矩阵的维度
m, n = len(matrix), len(matrix[0])
# 结果数组
result = []
# 两个方向,true 表示从下到上,false 表示从上到下
for i in range(m + n - 1):
# 根据当前对角线的索引确定其起点
if i % 2 == 0:
row, col = min(i, m - 1), max(0, i - (m - 1))
# 遍历该对角线
while row >= 0 and col < n:
result.append(matrix[row][col])
row -= 1
col += 1
else:
row, col = max(0, i - (n - 1)), min(i, n - 1)
# 遍历该对角线
while row < m and col >= 0:
result.append(matrix[row][col])
row += 1
col -= 1
return result
解释
起始位置:根据对角线的索引,我们可以判断其起点位置。起点的行列位置是通过 min(i, m-1)
和max(0, i - (m-1))
来计算的,反之在第二个方向上则使用max(0, i - (n-1))
和min(i, n-1)
。遍历:对于每一条对角线,直接从起点出发,向右下或向左上遍历,直到越界。
示例
如果我们用代码测试一下这个 3x3 的矩阵:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(findDiagonalOrder(matrix))
输出应该是:
[1, 2, 4, 3, 5, 7, 6, 8, 9]
可以看到,输出顺序正是我们预期的对角线遍历顺序。
复杂度分析
时间复杂度:每个元素只被访问一次,因此时间复杂度是 O(m * n),其中 m 是矩阵的行数,n 是列数。 空间复杂度:存储结果需要 O(m * n) 的空间,用来存储遍历结果。
最后的小感想
其实这个问题看起来很简单,直接的思路就能解决,但处理起来确实需要注意方向和起点的选择。你可能觉得这就是简单的遍历,其实背后还是有一些细节要把控,比如对角线的起点,遍历方向的控制等等。如果把这些细节处理不好,往往容易搞错,尤其是在处理矩阵这种“易错”的结构时。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。