package com.niuke;
import java.util.HashSet;
/**
* Created by admin on 2018/3/8.
* 数组中重复的数字
*/
public class FindCommonNumberInArray {
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation;
// Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++
// 这里要特别注意~返回任意重复的一个,赋值duplication[0]
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
public boolean duplicate2(int numbers[],int length,int [] duplication) {
//1 首先的想法是开一个额外数组用来保存原数组中数出现的次数,出现一次加一,
// 判断若新开数组中的数大于1,几位重复数字
int[] res=new int[length];
for(int i=0;i<length;i++) {
if(res[numbers[i]]==0) {
res[numbers[i]]++;
} else {
duplication[0]=numbers[i];
return true;
}
}
return false;
}
//2 利用位运算
public boolean duplicate3(int numbers[],int length,int [] duplication) {
// 将1左移numbers[i]位,然后与flag进行按位与运算
// 若flag上的第numbers[i]已为1,说明该位已被占用,数字重复了,
// 运算的结果大于0,返回false
int flag=0;
for(int i=0;i<length;i++) {
if(((1<<numbers[i])&flag)>0) {
duplication[0]=numbers[i];
return true;
}
flag|=(1<<numbers[i]);// 通过“或操作”填充flag中二进制位中的1
}
return false;
}
//3用到HashSet
public boolean duplicate(int numbers[],int length,int [] duplication) {
HashSet<Integer> set=new HashSet<>();
for(int i=0;i<length;i++) {
if(!set.add(numbers[i])) {
duplication[0]=numbers[i];
return true;
}
}
return false;
}
}
数组中重复的数字
最新推荐文章于 2021-02-28 03:22:48 发布