深圳iava外包越来越低了,5到10年竟然最多13K或者15K了,比前几年还低
深圳这波 Java 外包薪资,真有点看笑了。
5到10年经验,开口13K、15K,搁前几年这价连人都不好意思约来面试,现在倒好,像捡打折货。
评论区也挺真实。有人说,外包现在就是拿“有活先干着”压人,反正总有人接。还有人吐槽,岗位写得像要招技术合伙人,工资开得像招初级运维,HR自己发出去估计都心虚。
说白了,行情差大家都知道,但差成这样,已经不是市场问题了,是有些公司默认程序员会忍。真去干的人,多半也不是认这价,是手上刚好缺口粮。
算法题:拼接最大数
一上来最容易写错的,不是排序,也不是转字符串,是你把这题想简单了。
很多人看到“拼接最大数”,第一反应是把数组按从大到小排。9 放前面,34 比 3 大,也该放前面。真这么写,样例一过,边界一来就翻车。比如 3 和 30,你按数值排会把 30 放前面,结果拼出来是 303,但明显 330 更大。这个地方我第一眼就不太信“按数字大小排序”这套。
这题真正该比的,不是 x 和 y 谁大,而是 x+y 和 y+x 谁大。
比如:
9和34,比较934和3493和30,比较330和30312和121,比较12121和12112
谁拼出来更大,谁就应该排前面。现场感就这么点,想通了后面就顺了。
Python 里这题有个小别扭:sort() 没法直接传比较函数,要先用 cmp_to_key 包一下。我一般会这么写:
from functools import cmp_to_key
deflargest_number(nums):
arr = list(map(str, nums))
defcompare(a, b):
if a + b > b + a:
return-1
if a + b < b + a:
return1
return0
arr.sort(key=cmp_to_key(compare))
ans = ''.join(arr)
return'0'if ans[0] == '0'else ans
print(largest_number([10, 2])) # 210
print(largest_number([3, 30, 34, 5, 9])) # 9534330
print(largest_number([0, 0])) # 0
这里还有个坑,很多人提交完才发现:[0, 0] 不能返回 "00",只能返回 "0"。所以最后要补一句:
return'0'if ans[0] == '0'else ans
这句别嫌丑,线上题解里最容易漏的就是它。
再说下为什么这个比较规则是对的。你不用死背证明,记一个判断就够了:如果 a+b 比 b+a 大,那把 a 放前面一定更优。因为最终结果本质上是在尽量让高位更大,而两个数的相对位置一旦确定,对整体贡献最大的就是它们拼接后的字典序。
所以这题看着像贪心,落地其实就是“自定义排序”。难点不在代码量,在你能不能早点把比较规则掰正。规则一旦错了,后面写得再工整都没用。
这种题我一般不先急着写代码,先拿 3、30、34 这种数据在纸上比两轮。能比明白,再敲,不然就是调半天还觉得自己排序没问题。