Shopee前端二面面经
问的东西不多,先问了下项目,然后居然问了体系结构,问了我内存的读取相关的,我就说不记得了
之后问了httponly和协商缓存,怎么学习前端的,其他的就记不清了,
最后让我在本地写了个程序(用的是zoom视频会议,分享屏幕),面试官觉得性能太慢,改了两次后面也没写出来
程序很简单,就是对有序数组去重,但是要求在原数组上操作,于是一些骚操作(比如用set)就用不了了,甚至新建数组也不行
一开始,我忘了是有序数组,就用map记录数组的每一项,如果重复就用splice一个个删除,然后面试官说这个方法太慢了,如果有1万个0,运行会很慢
我才想起来是有序数组,然后就想找重复的相同元素一次删除,比如连续的1,除了第一个之外后面几个一次删除,然后面试官评价还是很慢,如果数组是[1,1,2,2,3,3,4,4...]这种,还是每次删除一个数组
于是我才想到那就干脆最后一次删除,刚开始把数组前面相同元素都替换成不相同的就好了,然后再截尾。然而写的完之后发现结果有点问题,然后时间原因就没有继续了,后面我自己看了下,发现找到非重复项,交换顺序后忘了写break结束循环,结果导致每次都是和一个数交换顺序。
感觉后面的算法面试挺好的,我写的程序性能不够也会提醒,感觉和其他面试相比可以有一点成长
这里贴一下我昨天下午面试完之后改的代码,i记录的是数组重复项,j用来查找数组中没有重复的项,语言当然是js
(前面两行是我试下速度,拿了10万个0看看,因为面试官说我前面的太慢,算个10万个0得很久,实测下来现在1s不到就结束了,hhh)
// arr = Array.from({ length: 100000 }); // arr.fill(0); arr = [1, 1, 1, 2, 2, 3, 3, 3, 3,3] reduce = (arr) => { let map = new Map(); let i = 0; for (let j=0; j < arr.length; j++) { if (!map.has(arr[j])) { i != j && ([arr[i], arr[j]] = [arr[j], arr[i]]); map.set(arr[i++], true); } } arr.splice(i, arr.length - i) }; reduce(arr); console.log(arr);