成都IT培训学校

面试中常见的js算法题

2017-04-21 10:30 作者:admin 来源:前端网 浏览: 我要评论(条) 字号:

摘要:我们去面试一般都有笔试,笔试题一般都会涉及到很多算法的东西。 不管你用的多不多,反正就是要会。不然笔试很难过。 就算是直接面试的,有时候也会遇到面试官直接叫你当场写个算法题出来这种情况。

因为笔试时间很有限,不会出很复杂的题目,所以笔试怎么出都不会离开下面这几种题。
废话不多说,下面来列出主要的几个算法题。

1.排序
一般都是给个数组然后排序,有的从小到大,有的从大到小。一定要看清楚。以下都是从小到大的排序算法。

冒泡法
 
1
2
3
4
5
6
7
8
9
10
11
12
 
 
    var arr = [3,6,1,2,5];
    var temp;
    for(var i= 0;i<arr.length;i++){
        for(var j=i+1;j<arr.length;j++){
            if(arr[i] > [j]){
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    console.log(arr);
 
 
 
 
快速排序法
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
 
function quicksort (arr){
    if(arr.length<=1){
        return arr;
    }
 
    var left = [];
    var right = [];
    var middle = arr[0];
 
    for(var i=1;i<arr.length;i++){
        if(arr[i]<middle){
            left.push(arr[i]);
        }else{
            right.push(arr[i]);
        }
    }
 
    return quicksort(left).concat([middle],quicksort(right));
}
 
 
 
 
注意:可以用快速就不要用冒泡。实在没记住才用冒泡。(因为快速排序设计到递归,面试官更多是想考察你递归算法)

2.数组去重
这题考察的是你会不会存储数组元素的出现次数来解决去重问题。当然解法也有很多,下面是其中一种解法。
 
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
Array.prototype.unique = function(){
 var res = [];
 var json = {};
 for(var i = 0; i < this.length; i++){
  if(!json[this[i]]){
   res.push(this[i]);
   json[this[i]] = 1;
  }
 }
 return res;
}
var arr = [112,112,34,'',112,112,34,'','str','str1'];
alert(arr.unique());
 
 
 
 

3.js的拷贝
这题涉及到的就是你能不能清楚的分辨深拷贝和浅拷贝。 var a = {name:'Tom'};  var b = a;  b.name = 'Peter';   请问a.name = ? 正确答案是Peter,如果你的答案是Tom的话,那么你要好好去看看js的深拷贝。 如果要被拷贝的是数组: slice和concat都可以直接让数组进行深拷贝 arr.slice(); arr.concat(); 下面是解法。当然肯定有比我写得更好的。
 
1
2
3
4
5
6
7
8
9
10
11
 
 
function deepCopy(source){
    var result = {};
    for(var i in source){
        if(typeof source[i] === "object"){
            result[i] = deepCopy(source[i]);
        }else{
            result[i] = source[i];
        }
    }
    return result;
}
 
 
 
 

4.获取字符串里出现子串的位置
 
1
2
3
4
5
6
7
8
9
10
11
 
 
function appear(str,str_target){
    var n = 0;
    var result = [];
    while(str.indexOf(str_target,n)!=-1 && n < str.length){
        result.push(str.indexOf(str_target,n));
        n = str.indexOf(str_target,n) + str_target.length;
    }
    return result;
}
var arr = appear('abascbascbabasbascbascascbab','ab');
console.log(arr);
 
 
 
 

5.不确定数量的数组遍历组合算法
好吧,解释下这题。这题在现实中确实会用到。尤其是做商城网站时,sku的算法真的经常会遇到。 这题的意思就是说。相当于说[1,2,3],[4,5]。。。。的不确定个数的数组进行遍历组合,组成[[1,4],[1,5],[2,4],[2,5],[3,4],[3,5]]这样。然后数组越多,组出来就肯定越多。 那怎么做的,我上网查了一些相关算法都没找到好的,然后我就自己写。可能还是会有点毛病,大家将就看。 有写的更好的欢迎评论教我一下。
 
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
 
 
function group(arr,re){
    if(arr.length <=0){
        return re;
    }
    if(!re){
        var arr = arr.slice();
        var re = arr.shift();
        return group(arr,re);
    }else{
        var now = arr.shift();
        var newre = [];
        for(var j=0;j<now.length;j++){
            for(var k=0;k<re.length;k++){
                var temp = [];
                if(re[k] instanceof Array){
                    temp = re[k];
                }else{
                    temp.push(re[k]);
                }
                newre.push(temp.concat(now[j]));
            }
        }
        return group(arr,newre);
    }
}
var arr = [['a','b','c'],['e','d','f'],['h','i'],['j','k','l','m']];
// var arr = [['a','b','c'],['e','d','f'],['h','i']];
// console.log(arr);
var result = group(arr);
console.log(result);        
 
 
 
 
 

6.lazyMan(这道题考察了很多内容)
这道题自行百度吧。。只要百度lazyMan 面试题,应该是可以搜出来的

7.编写一个函数fn(Number n),将数字转为大写输出,如输入123,输出一百二十三。
好吧,这道题我是忘了我看的本站的哪位的文章了,觉得确实有点意思。 下面是他的代码。
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
 
function fn(n){
    if(!/^([1-9]\d*)/.test(n)){
        return '';
    }
    var unit = '亿';
    if(n.length > unit.length){
        return '';
    }
    var newStr = '';
    var nlength = n.length;
    unit = unit.substr(unit.length - nlength);
    for(var i = 0; i < nlength; i++){
        newStr += ''.charAt(n[i]) + unit.charAt(i);
    }
    newStr = newStr.substr(0,newStr.length-1);
    newStr = newStr.replace(/(||)/g,'').replace(/()+/g,'').replace(/(亿|)/g,'$1');
    return newStr;
}
console.log(fn('205402002103'));
 
 
 
 

8.如何将浮点数左边的数每三位添加逗号
如1200000.11转成12,000,000.11
 
1
2
3
4
 
 
result = num && num.toString().replace(/(\d)(?=(\d{3})+\.)/g,function($1,$2){     return $2 + ',';
})
 
 
 
 
 

上面的解法是用正则,当然你也可以用别的方法。 以上就是面试常见题目。可能会有遗漏。欢迎补充。 不要光看。。要自己动手写一下,不然你以为你看会了。其实要你写,你还是写不出。 ok. 就这样。
顶一下
(0)
0%
踩一下
(0)
0%
标签:面试js算法题
版权所有: 非特殊声明均为本站原创文章,转载请注明出处: 成都学前端开发网-web.ixueyun.com
订阅更新: 您可以通过RSS订阅我们的内容更新

当前栏目分类