前端面試整理——javascript算法和測試題

(1)算法:

一、斐波那契數列:一、一、二、三、五、八、1三、21。輸入n,輸出數列中第n位數的值。

方案一:javascript

function fn(n){
        var num1 = 1, num2= 1, num3 = 0;
        for(var i=0;i<n-2;i++){
            num3 = num1+num2;
            num1 = num2;
            num2 = num3;
        }
        return num3;
    }
console.log(fn(7)) //13

方案二:java

function fn(n){
   if(n<=2){
        return 1;
   }
    return fn(n-1)+fn(n-2);
 }
console.log(fn(7)) //13

二、數組排序

1)冒泡排序

實現:
a、雙重for循環 b、指定比較的輪數和每輪比較的次數 c、若是符合條件就交換位置
流程:
a、比較相鄰的元素,若是第一個比第二個大,就交換他們兩個的位置。從開始第一對比較到最後一對,最後的元素是最大的元素。
b、從頭至尾再比較一次,每進行一輪最後的都是最大的了,所以後一輪比前一輪少一次比較。算法

function maopao(arr){
    var temp=0;
    for(var i=0;i<arr.length-1;i++){
        for(var j=0;j<arr.length-i-1;j++){
            if(arr[j]>arr[j+1]){
                temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
    return arr;
}
var s=[15,32,12,5,7,6];
var result=maopao(s);
console.log(result);

2)插入排序

//雙重for循環實現
    function  insertSort(arr){
        var  temp = 0;
        for(var i=1;i<arr.length;i++){
            var temp = arr[i];
            for(var j=i-1;j>=0;j--){
                if(arr[j]>temp){
                    arr[j+1]=arr[j];
                }else{
                    break;
                }
            }
            arr[j+1]=temp;
        }
        return arr;
    }
    //for+while實現
    function insertSort2(arr){
        var  temp = 0;
        for(var i=1;i<arr.length;i++){
            var temp = arr[i];
            var j = i-1;
          while(j>=0 && arr[j]>temp){
              arr[j+1]=arr[j];
              j--;
          }
            arr[j+1]=temp;
        }
        return arr;
    }
    var arr = [32,6,12,9,23,5,8,1,23];
    var arr2 = [32,6,12,9,23,5,8,1,23];
    console.log('for:'+insertSort(arr));
    console.log('while:'+insertSort2(arr2));

3)簡單選擇排序

三、用js實現二分查找

二分查找的前提是有序數組
實現:將要查找的值每次與中間值比較,大於中間值,則在右邊進行相同的查找,小於中間值則在左邊進行比較查找,找到返回索引值,沒找到返回-1。數組

一、非遞歸查找

function binarySearch(target,arr){
        var start = 0;
        var end = arr.length-1;
        while(start <= end){
            var mid = parseInt((start+end)/2);
            if(target == arr[mid]){
                return mid
            }else if(target > arr[mid]){
                start = mid + 1;
            }else if(target < arr[mid]){
                end = mid - 1;
            }else{
                return -1;
            }
        }
    }
    var arr = [1,2,4,6,8,9,11,34,67];
    console.log(binarySearch(11,arr));

二、遞歸查找

function binarySearch(arr,target,start,end){
        var start = start || 0;
        var end = end || arr.length-1;
        var mid = parseInt((start+end)/2);
        if(target == arr[mid]){
                 return mid
             }else if(target > arr[mid]){
                 start = mid + 1;
                 return binarySearch(arr,target,start,end);
             }else if(target < arr[mid]){
                 end = mid - 1;
                 return binarySearch(arr,target,start,end);
             }else{
                 return -1;
        }
    }
     var arr = [1,2,4,6,8,9,11,34,67];
     console.log(binarySearch(arr,11));

四、數組去重

方案一:函數

function fn(arr){
        var obj = {};
        var newArr = [];
        for(var i=0;i<arr.length;i++){
            if(!obj[arr[i]]){
                obj[arr[i]] = 1;
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }
 var arr = [2,4,7,3,5,2,8,7];
console.log(fn(arr));

方案二:測試

var arr = [2,4,7,3,5,2,8,7];
  var setArr = new Set(arr);
   var newArr = Array.from(setArr);
console.log(newArr);

方案三:this

var arr =[1,2,2,4,5,4,11,6];
function fn(arr){
    var a=arr;
    for(var i=0;i<a.length;i++){
       for(var j=a.length-1;j>i;j--){
           if(a[i]==a[j]){
                a.splice(j,1);
           }
       }
    }
    return a;
}
var s=fn(arr);
console.log(s);

五、數組求和

var arr = [10,23,45,70,10];
    var num1 =0;
//方案一
    arr.forEach((item)=>{
        num1 += item;
    })
    console.log(num1);
 //方案二
    var num2 =0;
    arr.some((item)=>{
        num2 += item;
    })
    console.log(num2);
//方案三
    var num3 =0;
    arr.filter((item)=>{
        num3 += item;
    })
    console.log(num3);
 //方案四
    var num4 =0;
    arr.map((item)=>{
        num4 += item;
    })
    console.log(num4);
//方案五
    var num5 =0;
    num5 = arr.reduce((num,now)=>{
        return num+now;
    })
    console.log(num5);



(2)測試題:

一、哪一個會彈出1?

A. if('21'<'15'){alert(1)}
B. if(15-15){alert(1)}
C. if('21'<15){alert(1)}
D. if('5'+0){alert(1)}

選D,解析:
1)'21'<'15' 字符串之間的比較,是按照從左到右的順序,逐位進行比較,按照unicode碼的大小
charCodeAt(index)用於獲取指定索引值位置的unicode
2)'5'+0 =》 '50' => true
+做用: 字符串拼接:左右兩側只要有一側是字符串,那麼就是字符串拼接prototype

二、輸出結果?

var i=0,j=0;
for(;j<6,i<10;i++,j++){
k = i+j;
}
console.log(k);//18
解析:
逗號運算符,返回最後一位code

三、(!+[]+[]+!+[]).length 輸出結果?

console.log((!+[]+[]+!+[]).length); //8
解析:
(!+[]+[]+!+[]) //truetrue
首先是這裏的第一個加號表明的是正號
!+[] 結果爲布爾值true
!+[]+[]結果爲字符串trueblog

四、2000['toString']['length'] 輸出結果?

console.log(2000['toString']['length']); //1
解析:
2000['toString']返回一個函數,function.length這裏返回函數的參數個數。

五、輸出結果是多少?

var f = function g(){return 23;};
console.log(typeof g()); // g is not defined
解析:
外部訪問不到g()函數

六、寫一個字符串轉成駝峯的方法

方法一:

function change(str){
        var s1 = str.split("");
        for(var i=0;i<s1.length;i++){
            if(s1[i] == '-'){
                s1[i+1] = s1[i+1].toUpperCase();
            }
        }
        return s1.join("").replace(/-/g,'');
    }
var str = "border-bottom-color";
console.log(change(str));

方法二:

function change(str){
        var s1 = str.split("-");
        for(var i=1;i<s1.length;i++){
           s1[i] = s1[i].charAt(0).toUpperCase() + s1[i].substring(1);
        }
        return s1.join("");
    }
var str = "border-bottom-color";
console.log(change(str));

方法三:

function change(str){
        var reg = /-(\w)/g;
        return str.replace(reg,function(s1,s2){
             return s2.toUpperCase();
        })
    }
var str = "border-bottom-color";
console.log(change(str));

七、查找字符串中出現最多的字符和個數

方法一:

function query(str){
        var obj = {};
        var s1 = str.split("");
        for(var i=0;i<s1.length;i++ ){
            if(!obj[s1[i]]){
                obj[s1[i]] = 1;
            }else{
                obj[s1[i]]++;
            }
        }
        var maxChar = '';
        var maxNum = 0;
        for(var key in obj){
            if(obj[key]>maxNum){
                maxNum = obj[key];
                maxChar = key;
            }
        }
        console.log(maxChar,maxNum);
    }
  var str = "sdfejdmdjskijfdheeehehehsss";
  query(str);

方法二:

function query(str){
        var obj = {};
        var num = 0;
        var value = 0;
        for(var i=0;i<str.length;i++){
            if(!obj[str[i]]){
                obj[str[i]] = [];
            }
            obj[str[i]].push(str[i]);
        }
        for(var attr in obj){
            if(num < obj[attr].length){
                  num = obj[attr].length;
                  value = obj[attr][0];
            }
        }
        console.log(value,num);
    }
    var str = "sdfejdmdjskijfdheeehehehsss";
    query(str);

方法三:

function query(str){
        var arr = str.split("");
        arr.sort();
        str = arr.join("");
        var num = 0;
        var value = '';
       var re = /(\w)\1+/g;
       str.replace(re,function(param1,param2){
            if(num<param1.length){
                num = param1.length;
                value = param2;
            }
       });
        console.log(value,num);
    }
var str = "sdfejdmdjskijfdheeehehehsss";
query(str);

八、如何給字符串加千分符?

方案一:

function fn(str){
           var arr = [];
           var num = str.length%3;
           if(num){
               arr.push(str.slice(0,num));
               str = str.substring(num);
           }
           var count = 0;
           var temp = '';
           for(var i=0;i<str.length;i++){
                count++;
                temp += str[i];
                if(count ==3 && temp){
                    arr.push(temp);
                    temp = '';
                    count = 0;
                }
           }
        var newStr = arr.join(',');
        console.log(newStr);
    }
    var str = '3323245678651456';
    fn(str);

方案二:

function fn(str){
       var arr = [];
       var num = str.length%3;
       if(num){
         arr.push(str.slice(0,num));
       }
       var count = 3;
       for(var i = num;i<str.length;i++){
           count --;
           if(count == 2){
               arr.push(str.slice(i,i+3));
           }else if(count == 0){
               count = 3;
           }

       }
       var newStr = arr.join(',');
       console.log(newStr);
    }
var str = '3323245678651456';
fn(str);

方案三:

function fn(str){
        // ?1\b表明不屬於獨立部分,開始、結束、有空格
        var re = /(?=(?!\b)(\d{3})+$)/g;
        console.log(str.replace(re,','));
    }
    var str = '3323245678651456';
    fn(str);

九、返回一個值包含數字類型的數組?

方案一:

function fn(str){
        var arr = [];
        var temp = '';
        for(var i=0;i<str.length;i++){
           if(!isNaN(str[i])){
                temp += str[i];
           }
           if(isNaN(str[i]) || (i== str.length-1 && !isNaN(str[i]))){
               if(temp){
                   arr.push(temp);
                   temp = '';
               }
           }
        }
        console.log(arr);
    }
    var str = 'js123ldka78sdassdfd653ssss3';
    fn(str);

方案二:

function fn(str){
        var re = /[0-9]+/g;
        var arr = [];
        str.replace(re,function($0,$1){
            arr.push($0);
        });
        console.log(arr);
    }
    var str = 'js123ldka78sdassdfd653ssss3';
    fn(str);

十、a,b兩個變量,不用第三個變量來切換兩個變量的值

方案一:

var a = 10,var b = 20;
   [a,b] = [b,a];
 console.log(a,b);

方案二:

var a = 10,b = 20;
a = [b,b=a][0];
console.log(a,b);

解析:
b=a 是賦值表達式、能夠像普通的表達式同樣用於任何表達式中,也包括在數組中使用。
a=[b,b=a][0]的執行順序是:
第一步把b的值放入數組的0下標中;
第二步執行b=a賦值表達式,對b從新賦值,並把這個值放入數組的1下標,這個數組的1下標是沒有用的,b=a寫這裏是爲了讓它在第三步以前執行。
第三步把數組的0下標賦值給a。

十一、有一個數n=5,不用for循環,怎麼返回[1,2,3,4,5]這樣的數組?

function fn(n){
        var arr = [];
        return (function(){
            arr.unshift(n);
            n--;
            if(n!=0){
                arguments.callee(n);
            }
           return arr;
        })();
    }
    console.log(fn(5));

十二、一個數n,當n小於100時返回n,不然就返回100

方案一:

function fn(n){
   return n<100?n:100;
}
console.log(fn(102));

方案二:

function fn(n){
       return Math.min(n,100);
    }
console.log(fn(99));

方案三:

function fn(n){
        switch(n<100){
            case true:
                return n;
                break;
            case false:
                return 100;
                break;
        }
    }
    console.log(fn(99));

方案四:

var n = 104;
   var arr = [n,100];
   arr.sort(function(n1,n2){
       return n1-n2;
   })
console.log(arr[0]);

1三、僞數組及轉化標準數組

方案一:for循環

var arr = [];
 for(var i=0;i<funs.length;i++){
     arr.push(funs[i]);
 }
console.log(arr);

方案二:

var arr = Array.prototype.slice.call(funs);
//或
var arr = [].slice.call(funs);

1四、如下題目彈出的結果是多少?

var i=0;
   alert(++i == i++);  //true

解析:
等式是從左往右執行,先是執行了++i ,而後進行比較,最後執行i++

1五、如下輸出結果是多少?

function Fn(){
        this.name = 'miaov';
        this.adress = '北京';
        return {}
    }
    var fn = new Fn();
    console.log(fn.name); //undefined
相關文章
相關標籤/搜索