在西安,除了华为和中兴,是不是其他公司的程序员,很难年薪超过 40万?
在西安写代码,年薪想摸到40万,很多人第一反应就是:去华为,去中兴,别做梦。话虽然损,但也不是空穴来风。西安这地方,岗位不少,能干活的人也多,可真敢给高价的公司,翻来翻去就那几张老面孔。
别的公司嘴上说重视技术,开薪资的时候又瞬间清醒,恨不得拿“城市生活成本低”当万能挡箭牌。
评论区也挺真实。有人说,40万不是没戏,是你得卷到带团队、扛项目、还能背锅。还有人更直接,说在西安拿这个数,靠跳槽比靠涨薪现实多了。这个我是真信。
所以这事不是西安程序员不行,是市场就这脾气。想在本地安稳,又想把薪资顶上去,难度确实不小。最后大概率还是那句老话:要么进大厂,要么出去,要么忍着。
算法题:单词规律
wordPattern 这题,代码不长,但新手特别容易写飘。
表面上看,是判断字符串 pattern 和一句话里的单词能不能一一对应。真写起来,很多人会只顾着从 pattern -> 单词 去映射,结果漏了反向校验。这个地方我一般第一眼就不太信。因为题目要的不是“能对上”,而是“双向唯一”,一个字母不能对应两个单词,一个单词也不能被两个字母共用。这个写法上的手感,和线上做幂等校验其实有点像,单边约束通常不够。整体写法我参考了你给的技术文那种“直接落问题、少讲空话、代码只贴关键几行”的气质来处理。
先看一个最容易出错的例子:
pattern = "abba"
s = "dog cat cat dog"
这个应该返回 True。
但如果是:
pattern = "abba"
s = "dog cat cat fish"
最后一个单词变了,就不成立。
再比如:
pattern = "abba"
s = "dog dog dog dog"
很多人第一次写,居然会判断成 True。问题就出在只记录了 a -> dog、b -> dog 没报错,却没意识到 a 和 b 已经撞车了。
我比较习惯直接上两个哈希表,一个管 字母 -> 单词,一个管 单词 -> 字母。别嫌麻烦,这比后面补漏洞省事。
classSolution:
defwordPattern(self, pattern: str, s: str) -> bool:
words = s.split()
if len(pattern) != len(words):
returnFalse
p_to_w = {}
w_to_p = {}
for ch, word in zip(pattern, words):
if ch in p_to_w and p_to_w[ch] != word:
returnFalse
if word in w_to_p and w_to_p[word] != ch:
returnFalse
p_to_w[ch] = word
w_to_p[word] = ch
returnTrue
这题真正该先看的,不是循环,而是这句:
if len(pattern) != len(words):
returnFalse
长度都对不上,后面根本没必要算。很多算法题都一样,先把能一刀砍掉的分支砍掉,代码会干净很多。
再说下复杂度。split() 一次,遍历一次,时间复杂度就是 O(n),空间复杂度也是 O(n)。这种题没必要为了省一个字典,把逻辑绕得很拧巴。面试里代码稳定,比花活重要。
还有一种写法也能做:比较首次出现位置是否一致。
defwordPattern(pattern: str, s: str) -> bool:
words = s.split()
if len(pattern) != len(words):
returnFalse
return [pattern.index(c) for c in pattern] == [words.index(w) for w in words]
这写法短是短,但我不太推荐。index() 每次都扫,复杂度会变高,而且可读性不如双映射。面试官真让你讲思路,还是前一种更稳。
这题不难,坑也不深,就一个:别只做半边映射。很多 bug 也都这个味道,看着像是“已经校验了”,其实只校验了一半。代码能跑,不代表判断真的闭环。停在这就行。