Python技术迷

入职了一家只有8个人的小公司,没想到成了我心中的神仙公司。

8个人的小公司,本来以为是那种老板一拍脑袋就改制度、财务人事全靠群里喊的地方,结果人家还挺像样。

入职该交的都交,双休也是真的双休,节假日不玩那套“先放后补”的操作。请个假也不跟你抠那点工资,这点就已经赢很多公司了。

Image

工资4900,听着不算高,也不包吃住,但人家每月还有点全勤奖励,下午茶、水果零食也没断过。你说这配置多豪华吧,也没有,但胜在不折腾人。

很多公司天天喊家文化,最后连最基本的规矩都做不明白。反倒这种小公司,安安稳稳把该给的给了,员工心里自然就有数了。HR看完估计都沉默两秒。

算法题:数组原型对象的最后一个元素

空数组一上来就炸。

arr = []
print(arr[-1])

日志很干脆:

IndexError: list index out of range

这题叫“数组原型对象的最后一个元素”,名字听着像 JavaScript,要往 Array.prototype 上挂一个 last() 方法。但换成 Python,别硬搬那个概念。Python 没有数组原型对象这一套,最贴近的写法,要么写一个函数,要么继承 list,给它补一个 last() 方法。

题目要求其实很短:返回数组最后一个元素;如果数组为空,返回 -1。

我一般先写最直接的版本,别上来整花活:

deflast_value(nums):
ifnot nums:
return-1
return nums[-1]


print(last_value([3, 8, 12]))   # 12
print(last_value([]))           # -1
print(last_value([0]))          # 0

这里有个小地方容易写错。

有人会这么写:

deflast_value(nums):
return nums[-1] if len(nums) > 0else-1

能跑,没问题。但在 Python 里,if not nums 更顺手,也更像平时写业务代码。空列表、空字符串、空字典都会被当成 False,这个判断够用了。

如果非要贴近“原型对象”这个味道,可以继承 list,自己封一个带 last() 的列表:

classLastList(list):
deflast(self):
if len(self) == 0:
return-1
return self[-1]


orders = LastList([101, 102, 103])
empty_orders = LastList()

print(orders.last())       # 103
print(empty_orders.last()) # -1

这段代码的关键不是继承,而是边界判断。

self[-1] 在非空列表里没问题,Python 会从尾部取第一个元素。但列表为空时,它不会返回 None,也不会返回默认值,而是直接抛 IndexError。所以空数组必须提前挡住。

再看复杂度。

这个操作没有遍历数组,也没有复制数组,只是按下标取最后一个位置:

时间复杂度:O(1)
空间复杂度:O(1)

这题别想复杂了。

真正要注意的是,Python 版本不要硬模拟 JavaScript 的 prototype。算法平台如果要求 Python,就按 Python 的习惯写;如果要求 JavaScript,再去扩展 Array.prototype。语言机制不一样,解题目标一样:空数组返回 -1,非空数组返回最后一个元素。

最后保留一个我更愿意提交的版本:

classSolution:
deflast(self, nums):
return-1ifnot nums else nums[-1]

短,够用,也不绕。