程序员老鬼

面试用Ai作弊,被识破了.....

刚刷到个程序员朋友面试用AI被当场识破的瓜,忍不住想说两句。😅 现在大家都知道AI能查题、能写代码,可真到面试,照搬AI答案其实一眼假。

Image

面试官本身就是老油条,问一个问题半天没反应,然后突然一大段“高分答案”输出,内容还不带自己理解,谁看不出来是背稿?说白了,写代码和面试一样,核心还是你的能力和思考。

我看网友有人吐槽现在面试环境卷,但也有人说用AI作弊太没底气。我认同后者。说到底,AI只是工具,临场应变和真实经验才是职场通行证。靠AI糊弄,最后吃亏的还是自己。

正儿八经准备,提升硬实力,才是王道。【备注:文末可领最新资料】

算法题:132 模式

看到有人在群里问132模式怎么写,我说我靠,这个题怎么又来了,之前刷LeetCode的时候还翻车过一次。你们有没有那种感觉,就是觉得这题表面很简单,其实细节超级多,稍微不小心就出锅。

我简单说下啥叫132模式吧。其实就是说,给你一个整数数组,问你能不能找到三个下标 i < j < k,满足 nums[i] < nums[k] < nums[j]。也就是中间那个最大,后面那个居中,前面那个最小,跟咱们小时候看的那个山形曲线差不多...我当时刚看到还以为是啥动态规划的套路,结果看了半天发现人家考的就是你对区间的理解能力。

我第一次写这题的时候啊,直接暴力,三层for,结果超时,LeetCode直接给我脸都不要了。我当时还是在办公室呢,旁边小李还笑话我,说东哥你这不行啊,得想点骚操作。我一开始想是不是用单调栈,后来发现还真是。

先说下核心思路哈,132模式,关键是找到j和k,j在k前面,k其实得是区间内的某个最大值,但又不能比i小。最简单的暴力想法肯定不行,复杂度太高。那怎么降复杂度?这题思路很妙,就是倒着来遍历,把区间最大值用个栈存着,左边用一个变量维护最小值,右边用个单调栈维护可能的k。

大概代码是这样,当然我写的时候还有点小细节,等会我再补充,反正先看个大概感受下:

publicbooleanfind132pattern(int[] nums){
if (nums == null || nums.length < 3) returnfalse;
int n = nums.length;
int[] stack = newint[n];
int top = n;
int third = Integer.MIN_VALUE; // k,理论上最大
for (int i = n - 1; i >= 0; i--) {
if (nums[i] < third) returntrue; // i < third < j
while (top < n && nums[i] > stack[top]) {
            third = stack[top++];
        }
        stack[--top] = nums[i];
    }
returnfalse;
}

这个栈我用的是数组模拟,因为Java自带的Stack不太好用,容易手抖写错...上面这段我第一次写就有个bug,忘了初始化top了,直接栈溢出,debug半天。后来我跟我们组的小王说,其实就用一个变量third记录“2”这个角色,单调栈每次出栈的时候,把可能的third最大化,这样就能确保栈里维护的是降序的,third一直往上提。

还有就是,nums[i] < third 说明已经有1 3 2这种关系了。注意点在于,third必须在nums[i]右边,因为我们是倒序遍历的嘛,这点很容易漏掉,我一开始就是没想到顺序问题,怎么都调不出来。

还有一种更直观的写法,就是用Stack,不过那样会慢一点,也更占内存,我后来就在公交车上边看边改,才明白为啥用数组模拟。

要说难点其实还是细节。你看while那一段,其实是把比当前nums[i]小的都弹出来,然后third就能拿到更大的值,这样下次遇到更小的nums[i]时就能立马判断了。还有就是top的初始值写错就挂了,这种问题就跟平时数据库写SQL没加分号一样,一不小心就寄了。

还有一点,记得判断nums.length < 3要直接返回false,我那天是直接交,LeetCode判了我个数组越界,半天没看出来。

总的来说啊,这题我觉得就很典型的LeetCode难题,思路不难,但实现细节多。你们可以试试自己写一遍,别直接粘我的代码。要是还没搞明白,等下我下楼拿个快递,回来再帮你们过一遍,最近外卖老迟到,真服了...

-END-

我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404