面试必考:求解两数之和

2021-04-06  本文已影响0人  isSunny

又到了一年一度金三银四找工作的时候了,最近自己的生活状态可以总结两点:不是在面试就是在准备面试,甚是疲惫啊~~
在面试和准备面试的过程中,遇到了几道面试频率很高的算法题,尤其是“两数之和”这道题,不仅在刷题的时候遇到了,在面试的时候,也遇到了至少两次,每次抱着侥幸的心理用双for循环写出来觉得很简单,但是当面试官问可否用单for循环的时候,确实有点傻眼。所以事实证明,凡事不要抱着侥幸心理,得过且过,一定要深究到底。下面废话少说,和我一起“深究”起来吧!

题目:

给定一个整数数组 `nums` 和一个目标值 `target`,请你在该数组中找出和为目标值的那 **两个** 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
**示例:**
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

方法一:

最简单的算法就是利用双for循环,找到我们想要的结果以数组形式返回。相信这个方法大家都会,就不多说了,直接上代码

function add(arr,target){
      for(let i=0;i<arr.length;i++){
        for(let j=i+1;j<arr.length;j++){
          if(i!==j&&arr[i]+arr[j]===target){
             return [i,j];
         }
        }
     }
}

方法二:

利用哈希表的特点,创建哈希表,寻找对应符合的值。这里可以想到对象是以hash结构来存储key,value的,所以我们可以创建对象。通过key和value来查找我们想要的结果,如果有就直接返回,如果没有继续设置“哈希表”。代码如下:

 function add(arr,target){
        let map = new Map();
        for(let i=0;i<arr.length;i++){
            let n = target-arr[i];
            if(map.has(n)){
                return [map.get(n),i];
            }
            map.set(arr[i],i);
        }
    }

注解:new Map是es6新增的,Map是键/值对的集合,这些键和值可以是任何数据类型。和普通对象的区别是它的key可以是任意类型,而普通对象无法使用非字符串值作为键名,另外Map对象有set()/get()/has()等方法,方便使用,更详细的可以自行百度咯。

下面再奉上普通对象的代码,思想一样,只不过改了一下写法而已:

 function add(arr,target){
        let map = {};
        for(let i=0;i<arr.length;i++){
            let n = target-arr[i];
            if(n in map){
                return [map[n],i];
            }
            map[arr[i]]=i;
        }
    }

好了,今天就写到这里吧,希望能对大家有帮助~~

上一篇下一篇

猜你喜欢

热点阅读