发薪日发现工资卡里多发了7万,我悄悄没给其他人说,结果同事告诉我说这是公司发的利润奖,平均每人3-5万!
这件事我看了真的是笑到肚子疼,大家想象一下:你在发薪日上,刚拿到工资卡,结果一看,多了7万!第一反应是不是觉得自己买彩票中大奖了?然后赶紧看了看,确认不是银行卡显示bug。
于是,默默心里想着:“这次运气太好了,应该赶紧装作没看见吧。”
可是,这件事显然没有那么简单。等着等着,突然有个同事甩出一句:“你知道吗?这次是公司发的利润奖,每个人3-5万。”我就默默地想:啥?居然是公司发的?你倒是早告诉我啊,我还差点没收着手不动,结果现在看起来好像低调成了傻逼。
这种情况还是挺让人心情复杂的。你想啊,我平时天天跟代码打交道,工资也不算低,可突然发个利润奖,感觉自己像一个被公司秘密宠爱的“幸运儿”。不过,这一切的背后,肯定是公司业绩好,老板手笔大——话说回来,这奖励是不是也太“程序化”了点?
算法题:最小操作次数使数组元素相等
这道题目看似简单,实际上需要我们仔细思考如何有效地处理字符串及其转换。
问题要求我们设计一个算法来判断一个给定单词的唯一缩写。所谓的“唯一缩写”,意思是对于一个单词,我们可以通过删除某些字符来获得一个缩写,这个缩写的唯一性需要满足某些规则。如果两个单词的缩写相同,那么它们的字符组合也应该相同。
让我们先理清楚题意,并且明确目标:给定一个单词,要求我们判断它的缩写是否唯一。一个单词的缩写的构成通常包括原单词中的字符及数字,数字表示在缩写中省略的字符数量。
比如,"apple"可以缩写为“a3e”,表示去掉了“p”这两个字符。问题的关键是:如何高效地判断一个单词的缩写是否唯一。
首先,假设我们有多个单词,而我们需要找到其中是否有两个单词具有相同的缩写。举个例子,单词“international”和“intercontinental”可以通过相似的缩写方式来表示,如何判断它们是否会冲突呢?
我们先来看看一个简单的思路:
defgenerate_abbr(word):
n = len(word)
abbrs = []
# 简单地考虑删除中间字符的情况
for i in range(1, n - 1):
abbr = word[0] + str(i) + word[-1]
abbrs.append(abbr)
return abbrs
这段代码尝试通过删掉中间的字符并保留第一个和最后一个字符来生成缩写。它只给出了一个简单的缩写形式,实际情况下可以有更多复杂的规则。这个思路能很好地处理一些基本的情况,但是它并不能解决多个单词缩写冲突的问题。
接下来,如何解决缩写冲突呢?我们可以通过哈希表来帮助我们检查每个缩写是否是唯一的。
假设我们有一个单词列表,我们将所有单词的所有缩写生成并存入哈希表中,如果出现重复的缩写,则说明这些单词的缩写不是唯一的。这里我们需要注意两点:
需要确保对于每一个单词,我们遍历所有可能的缩写形式。 哈希表的存储需要根据缩写的不同形式来判断是否有冲突。
接下来是具体实现:
from collections import defaultdict
defis_unique_abbr(words):
abbr_map = defaultdict(list)
for word in words:
n = len(word)
# 针对每个单词生成可能的缩写形式
for i in range(1, n):
abbr = word[:i] + str(n - i) # 比如将中间字符缩写成一个数字
abbr_map[abbr].append(word)
# 检查是否有重复缩写
for abbr, word_list in abbr_map.items():
if len(word_list) > 1:
returnFalse
returnTrue
这个代码的实现方式是:我们首先通过字典 abbr_map 来存储每个缩写形式及其对应的单词列表,然后遍历所有的单词生成缩写,并检查是否有缩写出现多次。如果某个缩写的值包含多个单词,说明这些单词的缩写并不唯一。
例如,给定单词列表 ["international", "intercontinental", "internal"],上述代码将会发现“intercontinental”和“international”的缩写可能是相同的,因此返回 False。
然而,这段代码仍然有可以优化的地方。我们可以进一步简化判断逻辑并考虑更多复杂的缩写规则。为了保证代码的可扩展性,我们可能还需要考虑一些边界情况,比如单词本身非常短时,缩写的处理方式会更简单。
我们可以进一步优化算法,使用更细粒度的缩写规则来避免冲突。
例如,如果两个单词有不同的前缀或者后缀,缩写的冲突就不太可能发生。这样,我们的算法不仅能处理常规情况,也能更加高效地处理长单词。
defget_abbreviation(word):
n = len(word)
if n <= 3:
return word # 对于3个或更少字符的单词,缩写即是原单词
return word[0] + str(n - 2) + word[-1]
defare_abbrs_unique(words):
abbrs = {}
for word in words:
abbr = get_abbreviation(word)
if abbr in abbrs:
returnFalse
abbrs[abbr] = word
returnTrue
这段代码通过判断每个单词的长度来决定是否缩写。
对于长度小于等于3的单词,我们直接将它们原封不动地返回;而对于较长的单词,我们按照前后保留一个字符,中间部分用数字表示的规则来生成缩写。最终,通过哈希表存储每个缩写,检查是否有重复的缩写形式。
这时候,我们就能够更高效地判断给定一组单词的缩写是否唯一了。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。