面试笔试题总结20170510


今天去面试,总结一下的笔试的题目

第一题

问:每3s读取input.txt的内容并打印到控制台中,分别用同步和于异步的方法

答:

1
2
3
4
5
6
7
8
9
10
11
const fs = require('fs');
const path = require('path');
//同步
let contentSync = fs.readFileSync(path.join(__dirname,'input.txt'),'utf8');
setInterval(function(){console.log('同步打印的内容:',contentSync)},3000);
//异步
fs.readFile(path.join(__dirname,'input.txt'),'utf8',function(err,data){
if(err) return err;
setInterval(function(){console.log('异步打印的内容:',data)},3000);
})

会照成死循环,JS是单线程的

第二题

问:把用户在输入框输入的数字,进行从小到大的排序

答:
看到这个题,我的第一想法就是利用数组的sort方法进行排序

1
2
3
4
5
6
7
function order(a,b){return a - b}
//用户的输入
var user_input = '34672268943';
var user_input_arr = user_input.split('');
console.log('user_input_arr sort before',user_input_arr);
user_input_arr.sort(order);
console.log('user_input_arr after',user_input_arr);

但是面试官说,主要不是考察sort,是考察算法排序的

1
2

第三题

问: JavaScript中如何给数组去重

答:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var arr_original = [1,2,3,4,2,4,,6,8,9,'1'];
var arr_unique = [];
//方法一,利用 Set 新特性,没有重复的集合
// NaN这货虽然有不全等的特性,在Set里面认为是相同的,所以只能有一个
var set = new Set(arr_original);
arr_unique = Array.from(set);
console.log('arr_unique',arr_unique);
//方法二,利用indexOf 方法
var i = 0;
for(;i<arr_original.length;i++){
var value = arr_original[i];
if(arr_unique.indexOf(value) == -1){
arr_unique.push(value);
}
}
//方法三,数组下标判断法,如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组
var i = 0;
for(;i<arr_original.length;i++){
var value = arr_original[i];
if(arr_original.indexOf(value === i )){
arr_unique.push(value);
}
}
//方法四,利用数组的includes 方法,
var i = 0;
for(;i<arr_original.length;i++){
var value = arr_original[i];
if(!arr_unique.includes(value)){
arr_unique.push(value);
}
}
console.log('arr_unique',arr_unique);

还有其他的去重的方法,在这就不一一列出来了
去重时需注意
var aa = [{},{},NaN,null,undefined,null,undefined]
aa.indexOf({}) //-1; aa.includes({}) //false
aa.indexOf(NaN) //-1; aa.includes(NaN) //true
aa.indexOf(null) //3 ; aa.includes(null) //false
aa.indexOf(undefined) //4;//aa.includes(undefined) //true
有上面得出: indexOf能去重不包含 {}NaN
includesSet能去重不包含 {}

第四题

问:应用服务器和游戏服务器有什么区别,对游戏服务器架构pomelo有什么理解?

答:看到这个题,懵逼了,游戏服务器没有接触过,pomelo是什么鬼,只有回来查了

1
2
3
4
5
6
7
8
9
10
一般的网站应用程序,是典型的Request-Response模式,通过tcp和服务器建立一次链接,而请求数据和影响数据通过http协议进行组装,
当完成一次交互的时候,服务器端和客户端tcp链接就会释放,把服务器端socket资源留给新的客户端。
通常web程序是比较好扩展的,通过硬件负载均衡和添加web服务器来实现,这一套方案业界都已经比较成熟了。
网游比较特殊,最大的特点在于客户端和服务器端是要进行长连接的,客户端和服务器端基本上一直要保持连接,不是典型的Request-Response模式,
Client会主动给Server发送数据,Server也可能主动往Client发送数据,生命周期比较长,一次发送的数据量比较小,但是数据交互发送比较频繁。
由于要进行长连接,服务器端的socket就不能进行复用,单台服务器处理请求是会有限。
用web的方案解决扩展问题,也不太适用。在web程序中,客户端之间的数据是没有交互的,所有的数据都是通过web服务器响应给客户端,
但是网游服务器中,每个客户端的数据的变化,都要通过服务器端广播给其他客户端。
所以客户端会有上限,这也就是为什么服务器要进行分区,一个区里面同时在线人数会有限制。

详细区别参考知乎的答案

1
2
3
pomelo的理解
一个网易开源的游戏服务段框架,与以往单进程的游戏框架不同, 它是高性能、高可伸缩、分布式多进程的游戏服务器框架,并且使用很简单。

中文文档