本文参考题目网站:leetcode
参考题目:
75.颜色分类
33.搜索旋转排序数组
(题目描述和题目例子可以到官方去看)
注意:本文只是我对于算法题目的不同解法(同一解法不同写法)的探讨,可能对面试有作用。
首先我们要了解的一个事情就是:不同问题有着不同的解法,这里的不同解法是一个解法可以用多种形式表达出来,比如对vector排序,我们可以用sort内置函数,还可以手撕一个冒泡排序或者归并排序等等,这是我理解的不同解法。但是,对于一个题虽说有着不同解法,当你用不同解法写出来的时候,时间复杂度和空间复杂度可能会有着不同,但是,在这些解法中,总有着更高效的解法,我们今天要讨论的就是这个。
75.颜色分类
这道题的话,我们可以有多个解法去解决,但是在面试的过程中,每一个解法带来的效率都有可能影响你面试的成功,我们来看第一个解法,最无脑的解法:
可以看到这种解法虽然可以通过该题目,但是面试官一看这种解法,可能直接就会说:”额,你这样,你先回去等通知吧。”那你就可能会问了,我不是通过了吗?是,你是通过了,但是你的这种写法连刚入门c++的程序员都能写的出来,更何况你还利用了额外空间fake,更不可能让你通过了(具体请看题目要求),所以这种写法万万不能写!
我们来看一下标准的写法

是不是就顺眼多了?面试官一看,哇塞!这是啥啊,我咋看不懂啊,这个时候你就可以装b了,这是三指针解法,left作为0的有边界,right作为2的左边界,通过curr指针的移动来进行划分,最后就可以达到题目要求。这样的解法会让面试官眼前一亮,如果你前面让面试官感觉很好的话,那么在你写完这种写法后,基本上实习工作就有了。
33.搜索旋转排序数组
对于这道题啊,更是有着巨多的解法。先来看第一种,脱裤子放屁型:

OK,如果你能写出这样的代码,那么恭喜你,你确实喜欢脱裤子放屁,可以回家等通知了,面试官看完都懵了,不是,你这先用lower_bound找到分割点,然后再用find?不是你咋不直接用find呢?你是不是二b啊。
吐槽完这一种,来一种直接放屁型的:
class Solution {
Public:
int search(vector<int>& nums, int target) {
return find(nums.begin(),nums.end(),target) != nums.end() ?
find(nums.begin(),nums.end(),target) - nums.begin() : -1;
}
};
截图放不下了,如果你能写出这样的代码,确实你喜欢直接放屁,你这种就是属于拉了一坨大的,我靠你直接find啊?不是说了这道题用二分吗?还是你听不懂我说话?有的人直接遍历去找这个target了,比用直接find的更厉害,时间复杂度直接为o(n)根本不符合题目的o(log n),虽然能过,但是这种就是属于趴着过的,如果你能写出着两种方法的其中一种,面试官根本就不会鸟你。
最后来看看标准写法:

好的,这才是标准写法嘛,满足了题目的要求,二分,时间复杂度都符合,还手撕了二分,不错,面试官估计也会让你过了,毕竟都把二分手撕出来了,还能要求什么呢,毕竟就是个小小的实习面试,具体的代码解释请自己分析。
总结
如果你想让你的面试官对你的印象好点的话,那么就去学习更高效的解法,不要求最高效的解法,但是,普遍的解法你得会,不然,要是使用什么别的乱七八糟的解法来解决题目的话,估计面试到这里也就凉凉咯,毕竟计算机是看你技术到底如何,如果你学历不太好,算法这边也过不了关的话,那么基本上面试就过不了了,所以,刷题并不是追求速度,而是追求高效的一个过程!
(不妨再观察观察那个脱裤子放屁的写法,虽然不提倡使用这种解法,但是其中有些细节没准你能发现,欢迎评论区讨论!)
1352

被折叠的 条评论
为什么被折叠?



