(hash)两数之和

两数之和

http://www.nowcoder.com/questionTerminal/20ef0972485e41019e39543e8e895b7f

题目链接:https://www.nowcoder.com/practice/20ef0972485e41019e39543e8e895b7f?tpId=46&rp=1&ru=%2Fta%2Fclassic-code&qru=%2Fta%2Fclassic-code%2Fquestion-ranking

不多说,直接放上代码:

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值。

全部评论

相关推荐

牛马人的牛马人生:500一天吗?香麻了
投递字节跳动等公司6个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-19 14:56
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务