美文网首页
面试必考:求解两数之和

面试必考:求解两数之和

作者: isSunny | 来源:发表于2021-04-06 17:37 被阅读0次

    又到了一年一度金三银四找工作的时候了,最近自己的生活状态可以总结两点:不是在面试就是在准备面试,甚是疲惫啊~~
    在面试和准备面试的过程中,遇到了几道面试频率很高的算法题,尤其是“两数之和”这道题,不仅在刷题的时候遇到了,在面试的时候,也遇到了至少两次,每次抱着侥幸的心理用双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;
            }
        }
    

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

    相关文章

      网友评论

          本文标题:面试必考:求解两数之和

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