今年哪个大厂取消了年终奖?
最近年终奖的话题可真是火了,尤其是在一些大厂的年终奖爆料中,大家的看法真是千奇百怪,有的让人羡慕,有的让人无奈。
有网友分享了一些年终奖的数据,看看这张图,年终奖最多的竟然有20万!
但紧接着,也有些年终奖低得让人忍不住想笑,有的0.1万、0.3万,甚至直接没有年终奖!这个差距,简直让人怀疑人生。
为什么会有这样的差距呢?其实这不仅仅是公司的财务状况问题,背后可能还涉及到企业的经营战略和不同岗位的奖金制度。
大厂们可能会给一些关键岗位更高的奖励,而一些岗位的奖励相对就少了点。
看到这样的年终奖爆料,感觉也是五味杂陈。你们的年终奖怎么样呢?有没有让你开心或者哭笑不得的情况?欢迎在评论区和我分享!【备注:文末可领最新资料】。
算法题:滑动谜题
今天我碰到一个有趣的算法题——滑动谜题。其实,初看这个题目,可能很多人都会觉得有点“晕”,因为它像是一个拼图游戏,但其实它背后是一个挺经典的二维数组操作题。我们一起来聊聊怎么解这道题。
假设有一个 3x3 的矩阵,它的目标是让其中的数字从乱七八糟的状态,通过一系列“滑动”操作,变成一个特定的顺序:从左到右、从上到下依次排列为 1, 2, 3,...,直到最后是 0(这个 0 是空白的位置,表示可以移动其他的数字)。问题就是给定一个打乱的矩阵,问能否通过移动空白块,最终还原成目标状态。
首先,我们要了解一下什么是滑动谜题。它是个经典的搜索问题。假设我们的矩阵是这样:
1 2 3
4 5 6
7 8 0
目标就是通过一定的“滑动”,把 0 变换成其他位置,让整个矩阵回到这个有序状态。
1. 解法思路
对于这个问题,可以使用 广度优先搜索(BFS) 来进行求解。BFS 是因为它是按层级逐步搜索的,正好适合我们这种找最短路径的题目。
每次我们都从当前状态的空白块(0)开始,尝试通过滑动把数字移动到空白块所在的位置,生成一个新的状态。然后继续扩展这个新的状态,直到找到目标状态,或者所有状态都遍历完了。
这里面有个关键点,就是如何表示每一个状态,以及如何判断是否达到目标。
2. 状态表示和状态转换
首先,我们要表示每一个状态。可以将每个状态表示为一个字符串,或者一个元组。比如初始状态可以表示为:
'123456780'
每个数字的位置就是一个状态,0 是空白块的位置。
然后,每次我们可以通过滑动空白块周围的数字,来生成新的状态。可以把这些状态存入一个队列中,并用一个集合记录已经访问过的状态,避免重复计算。
3. BFS 搜索
这里给出一个简单的 Python 实现,使用 BFS 来搜索:
from collections import dequedef slidingPuzzle(board):
# 目标状态
target = '123450'
# 初始化队列,开始状态
start = ''.join(map(str, [num for row in board for num in row]))
queue = deque([start])
visited = set([start])
# 相邻的滑动操作:上下左右
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
# 矩阵的行列数
rows, cols = 2, 3
def get_neighbors(state):
idx = state.index('0')
row, col = divmod(idx, cols)
neighbors = []
for dr, dc in directions:
new_row, new_col = row + dr, col + dc
if 0 <= new_row < rows and 0 <= new_col < cols:
new_idx = new_row * cols + new_col
new_state = list(state)
new_state[idx], new_state[new_idx] = new_state[new_idx], new_state[idx]
neighbors.append(''.join(new_state))
return neighbors
# BFS 开始
steps = 0
while queue:
for _ in range(len(queue)):
current_state = queue.popleft()
# 如果达到了目标状态,返回步骤数
if current_state == target:
return steps
# 遍历所有邻居状态
for neighbor in get_neighbors(current_state):
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
steps += 1
return -1
# 示例
board = [[1, 2, 3], [4, 0, 5]]
print(slidingPuzzle(board)) # 输出:1
4. 解释代码
在这个代码中,我们使用了广度优先搜索(BFS)来查找最短路径。首先,我们将初始状态转换为一个字符串,方便处理。接着,我们在队列中依次取出每个状态,然后通过调用 get_neighbors 方法,得到当前状态的所有邻居(即可以通过一次滑动得到的状态)。
get_neighbors 方法中,我们通过找出 0 的位置,尝试将 0 与它周围的数字交换,从而得到新的状态。
当我们找到目标状态 123450 时,直接返回当前的步数。这个算法保证了我们找到的是最短路径,因为 BFS 是按层级逐步扩展的。
5. 复杂度分析
时间复杂度方面,最多会生成所有可能的状态。由于状态的数量是有限的,因此最坏的情况是遍历所有状态。具体来说,状态的总数是 (即每行三列,每列有一个空白块可以移动)。因此,时间复杂度是 O(N),N 是状态的总数。
空间复杂度方面,我们需要存储每个状态及其访问标记,空间复杂度也是 O(N)。
6. 总结
滑动谜题其实看起来是个简单的拼图问题,但它背后是一个经典的状态搜索问题。通过广度优先搜索,我们能够确保在最短的步数内找到解决方案。这个问题不仅仅锻炼了我们对 BFS 算法的理解,还让我们学会了如何在状态空间中高效地进行搜索。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。