程序员老鬼

入职了一家只有8个人的小公司,没想到成了我心中的神仙公司。入职就交五险一金,双休节假日从不调休,请假也不扣工资。

这小公司也太会做人了吧。

8个人的小团队,听着像那种老板随时拍脑袋改规则的地方,结果人家还挺正规。入职五险一金直接安排,双休就是双休,节假日不搞什么“先欠着后面补班”,这点已经赢很多公司了。

Image

工资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];
    }
}

这就够了。

别把简单题写复杂。简单题最容易暴露习惯:边界有没有挡住,判断顺序有没有问题,有没有为了“看起来会算法”写一堆没必要的循环。