最近看到一个话题,简直让我差点笑出声。网友们在吐槽:公司竟然把测试岗位给裁了,让开发自己去测,真的是懵了!😱
说实话,作为开发人员,我们已经在做业务功能的设计、编码,甚至处理各种线上故障,能有一点点空闲时间,我就已经感谢天谢地了。
结果,现在还得抽空自己测试自己写的代码?这...简直是让人怀疑人生。
你说做开发和做测试是两码事吧。开发的目标是尽量写出优雅、高效、可维护的代码,而测试的目的是找到bug、发现潜在的风险,确保系统能够稳定运行。
开发和测试在思维模式上就有差异,测试人员天生就是“挑毛病”的,而我们这些开发呢,大部分时间都想着怎么做得更快、功能能实现就行了,哪还有闲心去细致地考虑所有可能的bug?🤷♂️
我个人觉得,如果真让开发自己做测试,可能会导致很多问题被忽视,等到上线后才发现漏洞,那可就麻烦了。希望这种决定只是短期内的“懒政”,不要成为常态!
算法题:拼接最大数
今天我们来聊个有点烧脑的题目:
拼接最大数
。
这个问题的目标是,给定一个非负整数数组,我们需要将这些数字拼接成一个最大的数。比如说,输入一个数组
[3, 30, 34, 5, 9]
,它的正确答案应该是
9534330
,而不是
9534303
。你有没有想过,排序怎么排才能得到最大值呢?
咱们一开始可能会按普通的数值大小来排序,比如把
9
排到最前面,再排其他的。问题来了,这种排序方式可不一定能得到最大数。想想看,
30
和
3
,它们的组合是
303
和
330
,显然
330
更大。所以,仅仅用数字大小来排序是不行的,我们得找个新的排序规则。
接下来,我们就要自定义一个比较规则了。我们不是单纯地比较两个数的大小,而是看拼接之后哪个更大。比如,给定两个数字
x
和
y
,我们就要比较拼接后的字符串
x + y
和
y + x
,谁大谁就排在前面。这样就能确保每次拼接得到的都是最大的数字。
这其实就变成了一个关于字符串排序的问题,只不过我们需要自定义比较函数。Python 中可以通过
functools.cmp_to_key
来将普通的比较函数转换成可以用于
sort
或
sorted
的关键字函数。
from functools import cmp_to_key
def compare(x, y):
# 比较拼接后的结果,x和y是字符串
if x + y > y + x:
return -1 # 如果x + y比y + x大,x应该排在前面
elif x + y < y + x:
return 1 # 如果y + x比x + y大,y应该排在前面
else:
return 0 # 相等的话,顺序可以随便
def largestNumber(nums):
# 将数字转换为字符串
nums = list(map(str, nums))
# 用自定义的比较函数排序
nums.sort(key=cmp_to_key(compare))
# 拼接成字符串
result = ''.join(nums)
# 如果拼接结果的第一个字符是'0',说明所有数字都是0
return '0' if result[0] == '0' else result
# 测试
nums = [3, 30, 34, 5, 9]
print(largestNumber(nums)) # 输出: 9534330
这里我用了
compare
函数来对每对数字进行比较。
cmp_to_key
让我们能将这个普通的比较函数转成
sort
需要的关键字函数。排序之后,我们把数字拼接起来,最后检查一下,是否拼接出来的结果是零。比如,给你
[0, 0]
,结果应该是
"0"
,而不是
"00"
。
对了,大家可能会想,这个算法是不是很慢呢?其实,排序的时间复杂度是
O(n log n)
,拼接字符串是
O(n)
,所以总体的时间复杂度是
O(n log n)
。这个算法已经相对高效了,如果你再去优化,可能会很复杂,毕竟排序是瓶颈。
总的来说,这类问题虽然是看似简单,但真正做起来就会发现,细节很重要。尤其是排序问题,很多时候你以为自己做对了,结果一不小心就把最大数拼成了最小数。
所以,掌握一些常见的排序技巧,尤其是自定义比较的技巧,对我们作为程序员来说真的特别有用。
对编程、职场感兴趣的同学,大家可以联系我微信:
golang404
,拉你进入“程序员交流群”。
🔥
虎哥私藏精品 热门推荐
🔥
虎哥作为一名老码农,整理了全网最全
《python高级架构师资料合集》
。
资料包含了
《IDEA视频教程》
、
《最全python面试题库》
、
《最全项目实战源码及视频》
及
《毕业设计系统源码》
,总量高达
650GB
,
全部
免费领取
。