A的ASCII码是65 a的ASCII是97
java中Int的范围-2147483648——2147483647
java中long的范围”-2^64“ 到”2^64 -1“
1.哈希表理论基础
day6 hash
那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里。
将学生姓名映射到哈希表上就涉及到了hash function ,也就是哈希函数。
哈希函数如下图所示,通过hashCode把名字转化为数值,一般hashcode是通过特定编码方式,可以将其他数据格式转化为不同的数值,这样就把学生名字映射为哈希表上的索引数字了
index = hashFunction(name) = hashCode(name) % tableSize
如果hashCode得到的数值大于 哈希表的大小了,也就是大于tableSize了,怎么办呢?
此时为了保证映射出来的索引数值都落在哈希表上,我们会在再次对数值做一个取模的操作,就要我们就保证了学生姓名一定可以映射到哈希表上了。
此时问题又来了,哈希表我们刚刚说过,就是一个数组。
如果学生的数量大于哈希表的大小怎么办,此时就算哈希函数计算的再均匀,也避免不了会有几位学生的名字同时映射到哈希表 同一个索引下标的位置。
一般哈希碰撞有两种解决方法, 拉链法和线性探测法
242.有效的字母异位词
Integer[] 变成int[]
Integer[] res = set2.toArray(new Integer[0]);
int[] a = Arrays.stream(res).mapToInt(Integer::valueOf).toArray();
- 快乐数
一个数的各个位置上的数字的平方用 % 来获得,下面是方法:
private int getNextNumber(int n){
int res = 0;
while(n > 0){
int temp = n % 10;
res += temp * temp;
n = n / 10;
}
return res;
}
- 两数之和
有两点
第一点用target - nums[i] + 哈希 来判断
第二点用map来记录数据,map的key代表数值,map的value存下标,
方法是不断向前面比,后面的不用比,后面的数字来和前面比
在遍历数组的时候,只需要向map去查询是否有和目前遍历元素比配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。