美文网首页JavaScript 进阶营
前端面试算法题(持续更新...)

前端面试算法题(持续更新...)

作者: 终身成长人格 | 来源:发表于2019-12-02 18:31 被阅读0次

    一、不借助临时变量,进行两个整数的交换

    //方法一 ES6
    var a = 1, b = 2;
    [a,b] = [b,a];
    console.log(a,b)
    
    // 方法二 异或运算,同为0或者同为1都为0,10为1
    var c = 3, d = 4;
    c = c ^ d;
    d = c ^ d;
    c = c ^ d;
    console.log(c,d)
    

    二、字符串查找:请使用最基本的遍历来实现判断字符串 a 是否被包含在字符串 b 中,并返回第一次出现的位置(找不到返回 -1)。

    例子:

    a='34';b='1234567'; // 返回 2
    a='35';b='1234567'; // 返回 -1
    a='355';b='12354355'; // 返回 5
    isContain(a,b);
    

    答案:

    function isContain(a, b) {
     for (let i in b) {
       if (a[0] === b[i]) {
         let tmp = true;
         for (let j in a) {
           if (a[j] !== b[~~i + ~~j]) {
             tmp = false;
           }
         }
         if (tmp) {
           return i;
         }
       }
     }
     return -1;
    }
    

    三、统计一个字符串出现最多的字母:给出一段英文连续的英文字符窜,找出重复出现次数最多的字母。

    例子:

    输入 : afjghdfraaaasdenas
    输出 : a
    

    答案:

    function findMaxDuplicateChar(str) { 
    if(str.length == 1) {
     return str;
    }
    let charObj = {};
    for(let i=0;i<str.length;i++) {
     if(!charObj[str.charAt(i)]) {
      charObj[str.charAt(i)] = 1;
     }else{
      charObj[str.charAt(i)] += 1;
     }
    }
    let maxChar = '',
      maxValue = 1;
    for(var k in charObj) {
     if(charObj[k] >= maxValue) {
      maxChar = k;
      maxValue = charObj[k];
     }
    }
    return maxChar;
     
    }
     
    module.exports = findMaxDuplicateChar;
    

    四、找出下列正数组的最大差值

    例子:

    输入 [10,5,11,7,8,9]
    输出 6
    

    答案:

    function getMaxProfit(arr) {
     var minPrice = arr[0];
     var maxProfit = 0;
     
     for (var i = 0; i < arr.length; i++) {
       var currentPrice = arr[i];
     
       minPrice = Math.min(minPrice, currentPrice);
     
       var potentialProfit = currentPrice - minPrice;
     
       maxProfit = Math.max(maxProfit, potentialProfit);
     }
     
     return maxProfit;
    }
    

    五、斐波那契数列:1、1、2、3、5、8、13、21。输入n,输出数列中第n位数的值。

    方案一:

    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
    

    方案二:

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

    六、用js实现二分查找:二分查找的前提是有序数组

    例子:

    将要查找的值每次与中间值比较,大于中间值,则在右边进行相同的查找,小于中间值则在左边进行比较查找,找到返回索引值,没找到返回-1。
    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));
    

    2.递归:

    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);
    

    方案三:

    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);
    

    配套视频课程链接:https://www.3mooc.com/front/learning/routesecond?subjectid=1232

    相关文章

      网友评论

        本文标题:前端面试算法题(持续更新...)

        本文链接:https://www.haomeiwen.com/subject/hubfgctx.html