这是某客公司的笔试题,时间是40分钟,当然我在40分钟是肯定做不完的,笔试就像考试,考验自己在某领域中对某项技能的熟练程度,考的基本是理论知识在实际中的运用,如果要提高自己能力,我觉得就要多做笔试题,在理论和实践结合的面试题中,熟能生巧,在今后的工作中遇到问题才能迎刃而解,在做笔试题的过程中,可以看到自己的不足,这样才好查漏补缺,更快地拿到double!
这我是利用工作的空余时间做的,鉴于本人能力有限,题目做得可能并不完美,还请大神指教!
这就是笔试题了:
- 数组去重、并按倒数第二个字母排序
- 设计一个分页、搜索及时显示
- five(one(one())) 返回 511
- 数字转中文, 1234 一千两百三十四
第一题
数组去重,很多面试题里面都考过,这道题是将去重和排序都结合起来了,考了对js数组的使用熟练程度。
我的思路是先将数组中重复的去掉,然后再按每个元素的第二个字母排序,当然,每个元素的长度至少为2。
function distinct(arr){
var obj = {};//用来装数组中的元素,用于判断重复元素。
var result = [];//去重后的数组
for(var i = 0,len = arr.length;i < len;i ++){
var item = arr[i];//拿到元素
if(item in obj){//判断是否已存在,如果存在,continue
continue;
}
obj[item] = 1;//如果不存在,那么就将该元素装起来
result.push(item);//装在结果集中
}
return result.sort(function(a,b){
return a.charCodeAt(a.length-2) - b.charCodeAt(b.length-2);
//取出每个元素的倒数第二个字母,取出charCode,然后进行比较。
});
}
var arr =['hello','world','nodejs','javascript',
'html','world','css','flash','adobe','java','hello'];
distinct(arr)
输出:
["adobe", "nodejs", "hello", "world", "html", "javascript", "css", "flash", "java"]
Array 中 sort 方法是用来对数组项进行排序的 ,默认情况下是进行升序排列,内置排序是冒泡排序,sort() 方法可以接受一个 function 为参数 ,这个方法有两个参数。分别代表每次排序比较时的两个数组项。sort() 排序时会比较相邻两个元素,如果返回值小于0或者等于0都不会交换元素,如果返回值大于0则会交换这两个元素,
var arr = [0,1,2,6,2,3,4,5]
arr.sort()
输出:[0, 1, 2, 2, 3, 4, 5, 6]
arr = [0,1,2,6,2,3,4,5]
arr.sort(function(a,b){return a-b})
输出:[0, 1, 2, 2, 3, 4, 5, 6]
arr = [0,1,2,6,2,3,4,5]
arr.sort(function(a,b){return b-a})
输出:[6, 5, 4, 3, 2, 2, 1, 0]
传入function相当于可以自定义排序了吧,如果里面装的是对象咋办呢,我们就可以利用sort传入的function参数做文章。
比如一个像这样的数组:
var arr = [
{index:0,name:'小菜'},{index:4,name:'小菜'},
{index:2,name:'小菜'},{index:9,name:'小菜'},
{index:8,name:'小菜'},{index:5,name:'小菜'},
{index:3,name:'小菜'}
]
现在有个需求是按照数组中每个对象的index进行排序,我们就可以这样做:
arr.sort(function(a,b){
return a.index - b.index;
});
输出:
可以看到,结果出来是按照index进行排序的。
第二题
设计一个分页、搜索及时显示
TODO
这个暂时没做,搜索及时显示,我的理解是用户在输入的时候ajax去请求数据,服务器返回搜索的数据并展示出来,分页也可以这样,传入页码,每页显示的个数,服务器返回数据显示出来,可以参照百度搜索,下回再分解。
第三题
five(one(one())) 返回 511
这道题感觉怎么这么简单呢,是不是我理解错了。。(/ □ )
function one(){
return 1 + '' + (arguments[0] || '') ;
}
function five(){
return 5 + '' + (arguments[0] || '') ;
}
five(one(one()));
输出:
511
第四题
以前一直都想写一个数字转中文,偷懒,一直没写,然后这次下决心写了一个。。只支持正整数和0,小数的话,无非是判断是否有小数点,小数点后的读法不带单位,负数的话,无非是判断是否有 - 号,这儿就偷下懒了o(∩_∩)o ,还有数字如果大于了9999999999999998,那么就要将转换的数字用引号包起来额。。。。
这儿涨点姿势:
大整数的精度丢失:[http://www.dwz.cn/wHje4)
中文数字单位:[http://www.dwz.cn/wHlPA)
中文中,四位四位隔开,每四位的单位是:’万’,’亿’,’兆’,’京’,’垓’,’杼’,’穰’,’沟’ ,小于四位的单位有十、百、千,通过把传入的数字参数每四位截开,然后再添加单位,我的思路就是这样。。具体看代码注释,代码如下:
function en2cn(num){
if(isNaN(num)){
throw new Error('这不是数字哦!');
return '';
}
// console.log(num);
var cn = ['零','一','二','三','四','五','六','七','八','九'];
var unit = ['十','百','千','万','亿','兆','京','垓','杼','穰','沟','涧','正','载'];//暂且就这么多单位吧。。
var str = num + '';
// console.log(str);
var result = [];
var index = 0;
// 1234 一千二百三十四
for(var i = 0;i < str.length;i ++){
((i+1) % 4 == 0) && result.unshift(convert(str.substr(str.length-i-1,4),index++));//四位数就转换
}
(str.length % 4) && result.unshift(convert(str.substr(0,str.length%4),index));//转换剩下的额数字
//num {String} 截断的数字,最多四位
//index {Number} 四位、四位、四位 0 1 2
function convert(num,index){
if(isNaN(num)){
return '';
}
var str = num + '';
str = '0000'.substr(str.length) + str;//不足四位的补足四位
var result = [];
for(var i = str.length - 1;i > -1;i --){
str[i] != '0' && result.unshift(unit[2 - i]);//不是零加 万以下的单位
result.unshift(cn[str[i]]);
}
return result.join('') + (str !='0000' && index > 0 ? unit[2 + index] : '');//万以上的单位,包括万
}
return result.join('').replace(new RegExp('(^' + cn[0] + '+)|(' + cn[0] + '+$)','ig'),'').replace(new RegExp(cn[0] + '{2,}'),cn[0]);//去除首尾‘零’、去除连续的‘零’
}
输出