(hash)两数之和
两数之和
http://www.nowcoder.com/questionTerminal/20ef0972485e41019e39543e8e895b7f
不多说,直接放上代码:
import java.util.*;
public class Solution {
/**
*
* @param numbers int整型一维数组
* @param target int整型
* @return int整型一维数组
*/
public int[] twoSum (int[] numbers, int target) {
HashMap<Integer,Integer> Myhash = new HashMap<Integer, Integer>();
for(int i = 0;i < numbers.length;i++){
Myhash.put(numbers[i],i+1); //在hash表里加入键和对应的值,例如【3,2,4】
//可以分成[3,1],[2,2],[4,3]
}
for(int i = 0;i < numbers.length;i++){
if(Myhash.containsKey(target - numbers[i]) && Myhash.get(target - numbers[i] )!= i+1){
return new int[]{i + 1,Myhash.get(target - numbers[i])};
}
}
return null;
}
}首先明白两个点:hash函数中的containkey、get方法;
get(k)
通过hashCode()方法计算出指定key对应的hash值,再通过哈希算法将其转化为数组下标,然后通过数组下标找到哈希表中数组对应的位置,如果这个位置上什么都没有,则返回null;如果有单向链表,再通过equals方法对比这个下标所在的位置上的链表中的所有节点的key值,如果所有都返回false,则返回null,如果指定key值与某个节点的key通过equals方法返回true,则将这个节点的value值返回。
containkey
这一方法可以查看hash表中是否有该key存在,如果有则返回true。
在本题目中,利用number[i]当做key值,反过来了,不过也很巧妙。首先把数组中的元素作为key,键值为数组元素对应下标+1分别放入其中。
再通过一次遍历和判断,判断条件是目标数减去数组元素,把得出的数当做key值判断,如果key存在进行第二个条件,如果这个key通过get方法得到的value不为该元素本身,那么就可以通过,最后返回i+1,get到的value值。
顺丰集团工作强度 382人发布