入职了一家只有8个人的小公司,没想到成了我心中的神仙公司。入职就交五险一金,双休节假日从不调休,请假也不扣工资。
这小公司也太会做人了吧。
8个人的小团队,听着像那种老板随时拍脑袋改规则的地方,结果人家还挺正规。入职五险一金直接安排,双休就是双休,节假日不搞什么“先欠着后面补班”,这点已经赢很多公司了。
工资4900,确实谈不上多高,不包吃住也很现实。但架不住它稳定啊。每个月还有200块全勤,下午茶免费,水果零食一直有,请假还不扣工资。
这玩意儿最戳人的地方不是福利多豪华,而是它没把员工当贼防。该给的给,该休的休,不整那些花活儿。很多大公司办公室亮得像机场,制度却抠得像地摊。
这种公司真不一定让你暴富,但起码上班不用天天跟老板斗智斗勇。打工人图啥,有时候不就是图个正常吗。
数组最后一个元素,别上来就遍历。
这题看着名字有点怪,叫“数组原型对象的最后一个元素”,明显是从 JavaScript 那边翻过来的题。在 JS 里可能是给 Array.prototype 挂一个 last() 方法。
但换成 Java,就别硬套“原型对象”了。Java 数组没有 prototype 这种东西,你能做的就是把这个能力封到一个方法里:
数组不为空,返回最后一个元素。
数组为空,返回 -1。
就这么点事。
我见过有人这么写:
int ans = -1;
for (int i = 0; i < nums.length; i++) {
ans = nums[i];
}
return ans;
能跑,但没必要。
你都知道要最后一个元素了,还从头扫一遍,这就像查日志明明知道 traceId,还非要按时间一页页翻。小数据看不出问题,大数据一来,这种习惯很容易带到别的地方。
直接看最后一个下标。
classSolution{
publicintlast(int[] nums){
if (nums == null || nums.length == 0) {
return -1;
}
return nums[nums.length - 1];
}
}
这里我加了一个 null 判断。
有些题目默认输入一定不为 null,那可以不写。但真实项目里我一般会保留。不是因为这题需要,而是这种工具方法一旦被别人复用,传个空引用进来太常见了。
测试一下:
publicclassArrayLastTest{
publicstaticvoidmain(String[] args){
Solution solution = new Solution();
System.out.println(solution.last(newint[]{10, 20, 30}));
System.out.println(solution.last(newint[]{}));
System.out.println(solution.last(null));
System.out.println(solution.last(newint[]{7}));
}
}
输出:
30
-1
-1
7
这题真正要注意的不是代码,而是边界。
nums.length - 1 这行,只能在数组长度大于 0 的时候执行。否则空数组会访问 -1 下标,直接抛异常。
所以判断顺序不能乱:
if (nums == null || nums.length == 0) {
return -1;
}
不要写成:
if (nums.length == 0 || nums == null) {
return -1;
}
这段看着差不多,实际上 nums 为 null 时,前半句已经炸了,后面的判断根本没机会执行。
复杂度也没什么可吹的。
时间复杂度是 O(1),因为只访问了一次数组末尾。
空间复杂度也是 O(1),没有额外开数组,也没有临时集合。
如果面试官追问“数组原型”怎么办?
在 Java 里可以这么回答:Java 不能像 JavaScript 一样给数组原型动态添加方法,所以这里用工具方法或者封装类来表达同样的能力。
比如写成工具类也行:
finalclassArrays2{
privateArrays2(){
}
staticintlastOf(int[] source){
return source == null || source.length == 0
? -1
: source[source.length - 1];
}
}
这就够了。
别把简单题写复杂。简单题最容易暴露习惯:边界有没有挡住,判断顺序有没有问题,有没有为了“看起来会算法”写一堆没必要的循环。