第一次面试分享
- 写在前面
- 面试流程
- 简单自我介绍
- 笔试题1
- 知识提问
- 加试题2
- 思路
- 面试官让总结自己的优劣势
- 总结
写在前面
腾讯面试之前会给你打电话确认,然后发邮件给你。邮件里面有远程面试地址和是否确认面试时间的地址。
面试岗位:前端开发实习生
就想出去实习学点技术,在学校学不到啥有用的。
得支棱起来!
面试流程
简单自我介绍
我超快,10s不到
笔试题1
给定两个版本号v1,v2。比较版本号,
- 如果v1>v2,返回1
- 如果v1
- 如果相等,返回0
案例
1.0 1.01 返回0
1.1.2 1.8 返回-1
2.1 1.8.1 返回1
1.0 1.0.0 返回0
//等等,记不清楚了,大概这个意思
思路就很简单,我们首先要拿到.分隔的数字
function deal(v1,v2){var num1=[],num2=[];var temp=0;/**************获取v1 .分隔的数字**********************/for(var i=0;i<v1.length();i++){if(v1[i]!=0){temp*=10;temp+=v1[i];}else{num1.push(temp);temp=0;}}num1.push(temp);temp=0;/*************************************/
}
写到这里,面试官给打住了,说我编程完全是c++的码风,我确实是没怎么写过JavaScript
面试官说这么写就没有意义了,有更简单的方法。我突然反应过来。可以直接用splice函数来分隔字符串
function deal(v1,v2){var num1=v1.splice('.'),num2=v2.splice('.');//这样直接就得到了.分隔的数字了,然后直接比较就可以了//然后下一个细节就是我们要两者的长度相同有一个补零的操作if(num1.length()>num2.length()){while(num2.length()<num1.length()){num2.push(0);} }else if(num1.length()<num2.length()){while(num1.length()<num2.length()){num1.push(0);} }for(var i=0;i<num1.length();i++){if(num1[i]>num2[i]) return 1;else if(num1[i]<num2[i]) return -1;}return 0;
}
然后这题算是做出来了吧,中间卡壳了,面试官会给你提示,总体感觉还是可以的。
知识提问
这个部分可以就记不全了。基本就是知道多少说多少,因为我根本没系统接触过这个东西,也没背东西。乱七八糟。
- css里面的position有那些值,说一说作用?
这题不就是relative absolute flex,写过css还是知道。
- 简单说一下访问网站的流程?越系统越好
乱七八糟,只知道dns,三次握手四次挥手。其他不知道
- 说一下浏览器缓存?
我只知道我之前hexo博客更新后,页面没更新就需要清楚一下浏览器缓存…其他不知道
- 然后追问了一个问题系统更新上线了,我不可能让用户去更细浏览器缓存,我们该怎么办?
我就说的把css的样式改变用js放到window对象里面,这样浏览器访问会自动执行js代码改变css样式
其他的都记不清楚了,反正就是不知道
加试题2
后面随便聊了一下,给了个加试题
LRU算法,set(key,value),get(key)。怎么清除最久没有使用的缓存?达到O(1)复杂度。
思路
这个O(1)的复杂度很容易就想到了map,但是set如果来做呢?
正确的答案是
利用链表和hashmap。当需要插入新的数据项的时候,如果新数据项在链表中存在(一般称为命中),则把该节点移到链表头部,如果不存在,则新建一个节点,放到链表头部,若缓存满了,则把链表最后一个节点删除即可。在访问数据的时候,如果数据项在链表中存在,则把该节点移到链表头部,否则返回-1。这样一来在链表尾部的节点就是最近最久未访问的数据项。
我的答案
LRU听都没听过,我直接说肯定要用map,还要用两个,第一个里面存在了,就把这个删除放到第二个里面,在第二个里面就次数+1.
最后把第一个里面的删掉就可以了,如果没有,就把第二个里面次数最少的删掉。
答的乱七八糟,这样没有考虑到时间了,一定要用链表的…
面试官让总结自己的优劣势
乱七八糟乱说一通
总结
- 最后面试官问我有什么需要提问的?
- 我说了你吃了吗?
- 面试官说没有
- 我说咱们先吃饭吧
可以说是草草收场,但是面出了自我,面出了风格。