不是哥们,码农的钱你也敢吞啊?
码农的钱你也敢吞?”这句话不仅写在了大街小巷,居然还被程序员们当做了“硬核”的讨薪方式。
这事儿的起因是某公司拖欠工资,结果程序员们竟然直接动手改了官网,做了一次“现场抗议”,血红的大字横空出世,立马引起了社会热议。💥
说实话,作为程序员,我挺佩服这些小伙伴的技术手段,真是把“技术”发挥到极致了。
然而,话说回来,这个方法真的值得提倡吗?风险实在太大,毕竟公司能把你弄上去,就能把你推下去。万一有点误伤,法律麻烦可就大了。
而且,能通过这种方式让公司屈服吗?未必。老板们也不傻,面对这种事情他们可能会选择“看热闹”,或者找借口甩锅,根本没啥正面的效果。
其实,程序员们如果真的想讨薪,还是得靠“正规渠道”来。你能写出一堆高级代码,但如果想要拿回自己的血汗钱,还是得有法律意识,走正规途径更保险。
千万不要被情绪冲昏了头脑。【备注:文末可领最新资料】。
算法题:得分最高的单词集合
聊一个算法题,名字叫做“得分最高的单词集合”。看名字就知道,这题听起来可能挺简单,但里面有点小陷阱。如果不小心,很容易就会“栽”在细节上。
简单来说,就是给你一系列的单词,每个字母都有一个固定的得分,任务是找出一组单词,使得它们的总得分最高。怎么理解这个题呢?说得再简单一点,就是你得在给定的单词库中挑选出一堆词,确保它们的分数总和最大。说白了,挑个单词,能让你的代码“升职加薪”!
题目里给定了字母分值,比如 A=1,B=3,C=3,D=2,E=1……这些字母的得分你都知道了。然后,你有一个单词库,任务就是从这些单词里,找出一组单词,使得它们的得分总和最大,而且这组单词的组成规则是:你选的每个字母只能用一次。
所以我们要怎么解这个问题呢?首先要理解,题目给的“字母只能用一次”这条规则,意味着我们得在处理这些单词时,尽量避免重复计分。你不能从两个不同的单词中都取同一个字母来组成你的“得分最高集”。每个字母一旦用掉了,剩下的字母就“封存”了。
接下来,我们就可以开始设计算法啦。首先,建立一个字母得分的字典,把字母和它的得分一一对应。然后,对于每个候选单词,我们需要计算它的得分,并检查这个单词所包含的字母是否符合我们的要求。如果符合条件,就可以将它加入我们的“单词集合”中,并更新当前的得分。
在代码实现上,我们可以考虑用回溯法来实现。回溯法的思想就是“试探性地选取某个解,如果不符合要求就回退重新选择”,这就好像我们做算法题时,决定不了就“试一试”。每次递归进入一个新的分支,尝试选择一个单词加入集合,直到没有更多的单词可以选择了为止。
来,看看这个简单的Python代码:
def maxScoreWords(words, letters, score):
letter_count = {char: letters.count(char) for char in set(letters)} # 记录字母的出现频率
max_score = 0 def backtrack(index, current_score, letter_count):
nonlocal max_score
if index == len(words):
max_score = max(max_score, current_score) # 更新最大得分
return
# 当前单词的字母及其计分
word = words[index]
word_count = {char: word.count(char) for char in set(word)}
# 判断是否可以加入当前单词
can_add = True
for char in word_count:
if letter_count.get(char, 0) < word_count[char]:
can_add = False
break
# 如果可以加入
if can_add:
# 扣除字母数量
for char in word_count:
letter_count[char] -= word_count[char]
backtrack(index + 1, current_score + sum(score[ord(char) - ord('a')] for char in word), letter_count)
# 恢复字母数量
for char in word_count:
letter_count[char] += word_count[char]
# 不加入当前单词,继续选择下一个单词
backtrack(index + 1, current_score, letter_count)
backtrack(0, 0, letter_count)
return max_score
# 示例
words = ["dog", "cat", "dad", "good"]
letters = ["a", "a", "c", "d", "d", "g", "o", "o"]
score = [1,0,9,5,0,0,0,0,1,4,3,2,7,7,5,1,3,4,1,3,1,0,0,0,0,0]
print(maxScoreWords(words, letters, score)) # 输出最大得分
这段代码的核心是回溯函数,它会“试”着加入每个单词,并在不符合条件的情况下退回。每次递归的时候,都要“扣除”已经用掉的字母,确保我们没有重复用字母。而得分的计算,则是通过每个字母的得分来加总。
所以,大家在做这类题目时,记得要特别注意如何合理地管理和“使用”资源,避免出现重复使用的情况。程序员写代码时也是一样,讲求效率和资源管理,哪怕是写一个简单的算法题,也要在细节上做到极致。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。