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);
查看10道真题和解析
