1. 程式人生 > >38-撩課大前端-面試寶典-第三十八篇

38-撩課大前端-面試寶典-第三十八篇

1.JavaScript實現二分法查詢?


二分法查詢,也稱折半查詢,是一種在有序陣列中查詢特定元素的搜尋演算法。
查詢過程可以分為以下步驟:
(1)首先,從有序陣列的中間的元素開始搜尋,
  如果該元素正好是目標元素(即要查詢的元素),則搜尋過程結束,否則進行下一步。
(2)如果目標元素大於或者小於中間元素,
  則在陣列大於或小於中間元素的那一半區域查詢,然後重複第一步的操作。
(3)如果某一步陣列為空,則表示找不到目標元素。
 程式碼:

 // 非遞迴演算法
 function binary_search(arr, key) {
   var low = 0,
   high = arr.length - 1;
   while(low <= high){
   var mid = parseInt((high + low) / 2);
       if(key == arr[mid]){
           return  mid;
       }else if(key > arr[mid]){
           low = mid + 1;
       }else if(key < arr[mid]){
           high = mid -1;
       }else{
           return -1;
        }
   }
};

 var arr = [1,2,3,4,5,6,7,8,9,10,11,23,44,86];
 var result = binary_search(arr,10);
 alert(result); // 9 返回目標元素的索引值

 // 遞迴演算法
 function binary_search(arr,low, high, key) {
     if (low > high){
       return -1;
        }
     var mid = parseInt((high + low) / 2);
      if(arr[mid] == key){
        return mid;
     }else if (arr[mid] > key){
        high = mid - 1;
        return binary_search(arr, low, high, key);
     }else if (arr[mid] < key){
        low = mid + 1;
        return binary_search(arr, low, high, key);
     }
};

 var arr = [1,2,3,4,5,6,7,8,9,10,11,23,44,86];
 var result = binary_search(arr, 0, 13, 10);
 alert(result); // 9 返回目標元素的索引值

2.你所瞭解到的Web攻擊技術?

(1)XSS(Cross-Site Scripting,跨站指令碼攻擊):
 指通過存在安全漏洞的Web網站註冊使用者的瀏覽器內執行
 非法的HTML標籤或者JavaScript進行的一種攻擊。
(2)SQL注入攻擊
(3)CSRF(Cross-Site Request Forgeries,跨站點請求偽造):
 指攻擊者通過設定好的陷阱,
 強制對已完成的認證使用者進行非預期的
 個人資訊或設定資訊等某些狀態更新。

3.寫一個function,清除字串前後的空格?(相容所有瀏覽器)

 var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/;
 var email = "
[email protected]
"; console.log(reg.test(email)); // true

4.有一樓梯共M級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第M級,共有多少種走法?

這個問題要倒過來看,
要到達n級樓梯,
只有兩種方式,從(n-1)級 或 (n-2)級到達的。
所以可以用遞推的思想去想這題,
假設有一個數組s[n], 
那麼s[1] = 1(由於一開始就在第一級,只有一種方法),
s[2] = 1(只能從s[1]上去 沒有其他方法)。
那麼就可以推出s[3] ~ s[n]了。
下面繼續模擬一下, s[3] = s[1] + s[2],
因為只能從第一級跨兩步, 或者第二級跨一步。

function cStairs(n) {
    if(n === 1 || n === 2) {
        return 1;
    } else {
        return cStairs(n-1) + cStairs(n-2)
    }
}

5.遞迴設計。 實現一個函式,給該函式一個DOM節點,函式訪問其所有子元素(所有子元素,不僅僅是直接子元素),每次訪問子元素的時候,併為其傳一個callback?

//訪問一個DOM tree,是一個經典的深度優先搜尋的演算法

function Traverse(DOM,callback) {
    callback(DOM);
    var list = DOM.children;
    Array.prototype.forEach.apply(list,(item)=>{
        Traverse(item,callback); //遞迴
    })
}