自建一个hash表,进行数据的存储
static int containsDuplicate2(int[] nums) {
//数组长度
int lg = nums.length;
//2维数组记录 数据,同时记录重复的数据判断值
int[][] hashNums = new int[lg][2];
//数组长度为1直接返回
if(lg == 1) return nums[0];
//遍历数组
for (int num : nums) {
//自定义hash算法,取得数据在哈希表中的脚标
int yu = num % lg;
if( yu < 0 ){
yu +=lg;
}
//哈希表中的[i][0]用于存放数据,[i][1]用于存放重复判断标志0为未重复,1为重复
while (true){
//[i][0] 位没有值,则初始赋值
if(hashNums[yu][0] == 0){
hashNums[yu][0] = num;
break;
}else if (hashNums[yu][0] == num){ //有值且相等,则初始状态位赋值
hashNums[yu][1] = 1;
break;
} else { //有值不相等,此时进行了所谓hash碰撞,进行散列到其他脚标位置
//改变yu 的值,以便后面的散列 注意次哈希算法简单,哈希碰撞可能比较平凡,
// 但是由于哈希表的一维长度是等于数组的长度的,所以不会存在一个值一直发送哈希碰撞
yu++;
if(yu>=lg){
yu -=lg;
}
}
}
}
for (int i = 0;i<lg;i++){
//根据状态位判断,不重复的数据
if(hashNums[i][1]==0) {
return hashNums[i][0] ;
}
}
return 0;
}