入职了一家只有8个人的小公司,没想到成了我心中的神仙公司。
8个人的小公司,本来以为是那种老板一拍脑袋就改制度、财务人事全靠群里喊的地方,结果人家还挺像样。
入职该交的都交,双休也是真的双休,节假日不玩那套“先放后补”的操作。请个假也不跟你抠那点工资,这点就已经赢很多公司了。
工资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]
短,够用,也不绕。