zoukankan      html  css  js  c++  java
  • 前端面试算法题

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

    
    //方法一 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);
    
  • 相关阅读:
    C# 灵活切换开发/测试/生成环境web.config
    c# sqlserver 删除大批量数据超时
    vue 上传进度显示
    sqlserver the name is not a valid identifier error in function
    WEBAPI 设置上传文件大小
    vue 获取视频时长
    webapi 导入excel处理数据
    vscode 通过ftp发布vue到azure服务器
    C# 汉字转拼音
    静态代码扫描工具
  • 原文地址:https://www.cnblogs.com/AaronNotes/p/14474753.html
Copyright © 2011-2022 走看看