工友们,看到标题,先别愤怒,第一末节,咱们先烘托讲一个 “面试问题应该从问【是什么】到问【为什么】” 的逻辑。
面试问题从【是什么】到【为什么】
关于前端是否有必要面试算法,本瓜看过许多争辩,相信你也一样听过不少,诸如此类:
正方:
“作业中又用不到,有必要吗?”、“一般后端都会把数据格式处理好”、“算法跟面试背八股文一样,不能测出实在才能”。。。
反方:
这儿不去议论两类阵营的观点孰对与错,而想同享一位大佬的履历,从别的一个视点看待这个问题:
原话:
面试应该搞清楚【为什么】,而不是停留在【是什么】。
什么意思?
假设面试官问你某一个问题,你没答出来,他就以此判定你“不合格”,那这位面试官也是“不合格”的。判定应试者不知道某一个问题,归于【是什么】(是不是知道?);合格的面试官、应该深挖一步,追问【为什么】(为什么不知道?)。是因为平常没有遇到过这样的相似场景吗?仍是因为选用的是其它技术手法或计划?或许因为更拿手其他点?。。。假设现在遇到了,会怎样去考虑呢。。。
每个人的履历、履历不一样,结合剖析问应试者【为什么】,顺着一个思路问下去,进行更深入、有用的交流,能更好的去匹配职位需求。
那么,再看“前端是否该面试算法”问题,用这个逻辑来想想。
-
不知道数据结构堆、栈、BFS、DFS 这些。 —— 为什么不知道?因为非科班出身,半路转岗?因为平常都在专心事务开发,对事务了解更透彻,数据结构这些都忘了?
-
递归算法写不出来 —— 为什么写不出?因为平常写的少、对递归不熟悉?仍是因为对面试题的了解、进程笼统有问题?
-
LRU、LFU 缓存算法没听过 —— 为什么没听过?vue keep-alive 缓存组件的战略了解过吗?是因为平常对 http 缓存或 dns 缓存注重更多吗?
……
一场好的面试一定是应试者和面试官两边都在吸收、生长。
(小技巧:下一次,假设遇到面试官直白的问:你会写 XX 算法吗?而刚好你听都没听过,不用严重,你可以沉着、镇定、平缓的反问:我之前作业中没触摸过这个算法,单纯猎奇啊哈哈,我想问下您这个算法在前端都有哪些使用场景?)
“作业两年,这么简略的算法题都不会?”
好了,有了第一末节的烘托,咱们再来看本文标题。(这句话来自于 fatfish 的一位朋友最近履历的一场面试中面试官说的。传送门:medium)
听完后,作为应试者,简直可以愤怒回怼这个面试官:我不会怎样了呢?作业不照样好好的?两年怎样了?吃你家一粒米了吗?你了解我的履历吗?我出套八股文面试题,你敢来面吗?想不通,去一边自己逐渐想去吧~~
……
理性一点考虑:这位面试官不懂问【是什么】到问【为什么】的面试逻辑,估量他预备的标题也是挺随意的吧,或许一向局限于自己的一点眼界。
也现实没必要跟这号人打嘴仗了,羁绊不休,嘴贱自有天收。(这么没礼貌的面试官即使存在,应该也是少数)不如咱心态好一点,坚持自己的逻辑:从面试履历中吸收、生长就好。
技术标题无罪,不要让欠好的面试领会干涉到技术学习上来。
有些算法题,想想也挺有意思~ 用安静的心态一起来看看这位两年履历老哥遇到的什么题?上题!
给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并回来它们的数组下标。
你可以假定每种输入只会对应一个答案。可是,数组中同一个元素在答案里不能重复呈现。
你可以按恣意次序回来答案。
例1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解说:因为 nums[0] + nums[1] == 9 ,回来 [0, 1] 。
例2:
输入: nums = [3,2,4], target = 6
输出: [1,2]
例3:
输入: nums = [3,3], target = 6
输出: [0,1]
噢!刷过力扣的 xdm 应该都知道了,此题典中典,题库第一题 (就像英语四级的 abandon) —— 两数之和。
江湖上还流传过【不知两数和,刷极力扣也枉然】的言辞;看谈论,这题甚至还难倒过某博士生老哥 哈哈哈,其特别可见一斑!
刷过此题的都知道:这题调查的不是双层 for 循环暴力解题,而是转化思路,用 map,减少使用一层 for 循环,下降时间凌乱度解题;
所以面试官看似问你怎样解题,实则留了一手,要问你:怎样优化暴力解法?
假设之前又刚好没有看过、学习过这类转化思路,在面试的情况下,短时间有或许真的就想不起来。
解一:双层 for 循环暴力解法
const twoSum = (nums, target) => {
const len = nums.length
for (let i = 0; i < len; i++) {
// 因为同一元素不允许重复呈现,所以从i的下一位开端遍历
for (let j = i + 1; j < len ; j++) {
// find the answer, return
if (nums[ i] + nums[ j ] === target) {
return [ i, j ]
}
}
}
}
解二:使用 map 解,下降时间凌乱度
var twoSum = function(nums, target) {
const map = new Map();
for(let i = 0, len = nums.length;i < len;i++) {
// 一层遍历,用 target 减去每一项,在 map 的 key 中寻找
if(map.has(target - nums[i])) {
// 存在则回来效果
return [map.get(target - nums[i]), i];
}
// 不存在,则设置 map key 和 val
map.set(nums[i], i);
}
return [];
};
这位两年履历老哥便是这样,回答出来了第一种解法,在第二种解法折戟。
无法,面试官总想要的更多……
其实也不止这题,许多面试算法题都是这样,暴力解法只是整个问题的第 1 小问,关键是第 2 小问怎样转化思路、优化暴力解法,减少时间/空间凌乱度。
无独有偶,这让我想起:当本瓜仍是前端二年级生的时分,就在某次大厂面试中遇到过和这个十分相似的算法面试题,以前的文章提到过-剑指 Offer II 016. 不含重复字符的最长子字符串,后来我才知道这题优化双层 for 循环暴力解法思路 —— 滑动窗口,当时是真的一点不知道。
好在,那位面试官没有说:“这都不会?” 否则直接自闭。
小结一两句:
愿技术大牛、老迈哥们,对新人多一点好意吧。不是谁都是高校计算机科班出身、有大厂实习履历、或遇到贵人指出工作规划、学习要点等等。
我就见过也还不少吧,学资料的、学金融的、甚至学雕塑的,转投互联网工作,学技术、做开发。没有计算机根底,没看过数据结构的书。有家庭需要去支撑、有在大城市打拼站住脚的想法;没有孰好孰坏,我们履历不一样、阶段不一样罢了。
前端面算法,可以,说出个条条道道,经过一场面试,能帮忙应试者能生长,也是帮自己生长吧。找作业罢了,说难听的话,没必要。
OK,以上便是本篇同享。点赞注重谈论,为好文助力
我是安东尼 100 万人气前端技术博主 INFP 写作人格坚持 1000 日更文 ✍ 注重我,安东尼陪你一起度过漫长编程年月
我正在参加技术社区创作者签约计划招募活动,点击链接报名投稿。