• 面试中的算法


    最近面试总会被问到在一堆数组中找两个数,他们的和等于目标值

    我的一反应就写了一个双重循环。

    function sum1(arr, dst){
      for(let i = 0,j=arr.length;i<j;i++){
        for(let k = i+1;k<j;k++){
          if(dst === arr[i] + arr[k]){
            return [arr[i], arr[k]]
          }
        }
      }
      return null;
    }

    当面试官问算法复杂度,和是否可以优化时,我的一反应知道是可以优化的,但是就是不知道如何写, 当时脑袋浆糊了。。。

    后面面试官问了下 hash表,   hash表的原理, 然后还提示我用hash优化, 我还是没有写出来, 很尴尬。。。

    看了一下网上的,顿时茅舍顿开。。。

    function sum2(arr, dst){
      let map = {};// key 为元素值, val 为元素索引
      for(let i = 0,j=arr.length;i<j;i++){
        let dif = dst -  arr[i];
        if(map[dif]!==undefined){
          return [dif, arr[i]]
        }
        map[arr[i]] = i;
      }
      return null;
    }

    问题又来了, 如何找出所有满足的数?

    function sum3(arr, dst){
      let map = {};// key 为元素值, val 为元素索引
      let ret = [];
      for(let i = 0,j=arr.length;i<j;i++){
        let dif = dst -  arr[i];
        if(map[dif]!==undefined){
          ret.push([dif, arr[i]])
        }
        map[arr[i]] = i;
      }
      return ret;
    }

    问题又来了, 如果数组中有重复的呢?

    function sum4(arr, dst){
      arr.sort((a,b)=>a-b);// 确保元素从小到大
      let map = {};
      let ret = [];
      for(let i = 0,j=arr.length;i<j;i++){
        let dif = dst -  arr[i];
        if(map[dif]!==undefined && map[dif][1]===false){
          map[dif][1] = true;
          ret.push([dif, arr[i]]);
        }
        map[arr[i]] = [i, false];
      }
      return ret;
    }

     问题又又来了, 如果找三个数呢? 思路和找两个数一样

    const threeSum = (arr, sum) => {
       for(let i = 0; i < arr.length; i++){
          const indices = sum2(arr, sum-arr[i]);
          if(indices  && !indices.includes(i)){
             return [i, ...indices];
          };
       };
       return -1;
    };
  • 相关阅读:
    rzc generate exited with code -2147450730.
    c#WebService动态调用
    c#BarTender打印,打印微调
    记一次ios下h5页面图片显示问题
    FID
    RSA密钥对生成,并解析公钥指数和模数
    angularjs-6
    angularjs-5
    angularjs-4
    angularjs-4
  • 原文地址:https://www.cnblogs.com/dzqdzq/p/14823916.html
Copyright © 2020-2023  润新知