感觉有点不对劲,全组开会不叫我,连续三次了。。。
看到一个网友的吐槽,挺有意思的:“全组开会不叫我,连续三次了,感觉有点不对劲。”
说实话,有时候这种事发生,可能是因为大家都在忙,有些细节就忽略了。
但连续三次都没被叫到会,这就不只是“漏掉”这么简单了,感觉像是被“排除”在外了吧?
这种情况,可能是自己在团队中的存在感不够,或者沟通上出了点问题。
作为程序员,我们常常埋头做技术,搞得自己有点“闭关修炼”,但其实团队合作也是非常重要的。如果老是错过会议,很容易被“掉队”,工作方向都可能偏离了。
我觉得,如果真是这样的话,最好找个机会主动跟团队沟通一下,别让自己悄无声息地消失在这个大团队里。毕竟,在技术岗位上,不只是要代码写得好,有时候,主动表现一下自己,也能让人记得你。
所以,感觉有点不对劲时,不妨主动点,站出来!【备注:文末可领最新资料】。
算法题:使序列递增的最小交换次数
今天我们来聊一个挺有意思的算法题。使序列递增的最小交换次数。
给定一个无序的序列,你需要找到最少的交换次数,使得序列最终变为递增序列。听起来好像是排序问题,但是它的挑战性在于,要求我们用最小的交换次数来解决。
首先,如果你以为这道题就是普通的排序问题,那你就错了。它的精髓在于“最小交换次数”上。你可以使用冒泡排序或者其他常见的排序算法来解决,但是这些算法的交换次数通常比较多。而问题是要求我们最小化交换次数。
那么,如何才能得到最少的交换次数呢?我们需要换一个角度来看待问题。
重点在于“位置”而不是“值”
我们可以通过将序列中的每个元素按照其原本的顺序重新排列成索引,然后使用最小交换次数来使得元素排成递增序列。具体来说,最简单的思路是将每个数字和它应该处于的“正确位置”进行比对。我们会发现,这就变成了一个关于环路的问题。
首先,记录每个元素的位置,然后根据这个位置构造出一个新的序列。然后,我们可以通过环路理论来计算最小交换次数。
举个例子
假设我们有一个序列 [4, 3, 2, 1],我们的目标是将它变成递增的 [1, 2, 3, 4]。可以通过以下步骤实现:
创建一个由原序列元素组成的索引-值对列表: [(4, 0), (3, 1), (2, 2), (1, 3)]按照数字值对这些索引值进行排序: [(1, 3), (2, 2), (3, 1), (4, 0)]然后,遍历每个数字,并计算每个数字应该交换的次数。
实现代码
def minSwapsToSort(arr):
# 创建一个索引-值对的列表
n = len(arr)
arr_pos = [(arr[i], i) for i in range(n)] # 按照值排序
arr_pos.sort(key=lambda x: x[0])
# 用一个布尔数组标记访问过的元素
visited = [False] * n
swap_count = 0
for i in range(n):
# 如果已经访问过或者元素已经在正确位置上,跳过
if visited[i] or arr_pos[i][1] == i:
continue
# 计算当前环的大小
cycle_size = 0
j = i
while not visited[j]:
visited[j] = True
j = arr_pos[j][1]
cycle_size += 1
# 如果有一个环,交换次数为环的大小减去1
if cycle_size > 1:
swap_count += (cycle_size - 1)
return swap_count
代码解析
索引-值对:首先,我们将每个元素和它的原始索引一起存储。这个步骤非常重要,因为我们需要知道每个元素原来的位置。 排序:我们按照元素的值对它们进行排序。这样,我们就可以通过比较当前元素和它目标位置的差异来计算交换。 环的计算:接下来,我们用环的理论来解决交换问题。每个环代表了一些元素,它们彼此之间可以交换,最终达到正确位置。环内的交换次数就是环的大小减去1。
小结
通过这种方式,我们将问题转化成了环路问题,而每个环的最小交换次数就是环内元素数量减去1。最终,所有环的交换次数加起来就是使序列递增所需要的最小交换次数。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。