37-撩课大前端-面试宝典-第三十七篇

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); //递归
    })
}

猜你喜欢

转载自blog.csdn.net/lkitlike/article/details/86346218