废话不说,直接上题。
1.n个人,围在一起报数,报3的就出来,最后剩下谁?其实就是猴子报数问题
我以为面试官是要我算出来,所以使用了数学上的列举方法,然后得出表达式。但是弄了几分钟,没得出表达式,就放弃了。后面,回去想了想,面试官应该是要你写出代码来实现这个解决方案。哎,面试官如果当时提一句,你怎么实现的,那我就不会走偏方向了。所以面试时,如果自己不确定面试官问的什么,你可以让面试官表达清楚一点。
代码实现方案:
定义一个数组a[n],里面全部是1,然后while(1)循环数组a[n],while循环外面定义一个变量i=-1,len=n,while(--len)循环里面:
{
for(var j=0;j<3;j++){
i++; //如果a[i]等于1,就证明它没去掉,就可以报数。
if(i>=n){
i = i%n;
}
if(a[i] ==0){ //如果a[i]等于0,也就意味着a[i]的猴子已经去掉了,这次循环就取消
j--;
}
}
a[i] = 0;
}
最后循环数组A,找出不等于0的index值,就是所得。
效率:n*k(k=3)。
此方法比较简单,应该还有n+k的方法,无须研究,又不是搞算法大赛。
2.域名解析的过程,用户第一次输入www.tencent.com
我说,去域名服务器找IP,面试官说:怎么去找的?域名服务器在哪里?
卡住了,百度后得到以下结果:
- 浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。
- 系统缓存 – 如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。这样便可获得系统缓存中的记录。检查自己本地的hosts文件是否有这个网址映射关系
- 路由器缓存 – 接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存。如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。本地DNS解析器可以使本地的路由器。
- ISP DNS 缓存 – 接下来要check的就是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。首先会找TCP/IP参数中设置的首选DNS服务器(ISP的DNS)
- 递归搜索 – 你的ISP的DNS服务器(www.baidu.com.www.alibab.cn)没有,就往上级找,直到根域名服务器,“根DNS服务器”收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP,负责com的顶级域名服务器搜索(比如:cn,com,net),最后走到tencent.com的二级域名服务器,找到www.tencent.com域名服务器。如果都没有,就返回找不到页面。
- 因为域名服务器的查找,有递归和轮询的方法,这都是通过ISP的DNS服务器操作的。最终ISP的DNS服务器返回ip给客户端。
由于域名服务器有负载均衡的功能,因此,会根据服务器的负载以及用户的定位操作,给定相应的域名服务器,同时,域名服务器解析出IP地址,不同的域名服务器可以解析出不同的IP地址,但是内容一样。
3.正则匹配URL。
写了一个匹配http的url,面试官说,还有其他协议的呢,然后就瞬间凌乱了。ftp,https等等,我还记得大学学网络时,还有其他各种协议,百度得:
\d -> 数字
\s -> 空格,换行,tab键等
? -> 0个或一个
* -> 0个或多个
+ -> 一个或多个
^ -> 开头
$ -> 结尾
. -> 任何字符
() -> 子表达式
g -> 全局搜索(要考虑lastIndex)
i -> 忽略大小写
m -> 多行查找
.*? -> 非贪婪模式
\ -> 将下一个字符标记为特殊字符
a{3,4} -> 最少匹配连续3个a,最多匹配4个连续a
[a-z] -> 匹配a到z的任意一个字符,[^a-z] -> 匹配不是a到z的任意字符。
4.在IE6,7下怎么调试?
Firebug Lite ,IE WebDeveloper。
这题实际就是想知道你有没有调试过IE6和IE7。我没有,所以就没回答。这题意义不大。调试工具的使用都一个样。而且ie7都要淘汰了。何必执着技术的深入,而忘记实际的应用呢。
5.谈谈mvvm框架。
个人觉得意义不大,就是看你对新技术有没有了解。项目中没用到,去学的话,我是不愿意去的。但是知道它是下一代MVC前端框架就行了。Angular.js是杰出代表。页面编写和业务编写分离,极大的加快了开发的进度,以及代码的分离。
基本就这几个问题,没回答出来。
加油。