面试必考:求解两数之和
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;
}
}
好了,今天就写到这里吧,希望能对大家有帮助~~