1.対象要件
長さnの配列nums内のすべての数値は、0〜n-1の範囲です。配列内のいくつかの数字が繰り返されていますが、何回繰り返されているのか、各配列が何回繰り返されているのかわかりません。配列内で重複する番号を見つけてください。
输入: [2,3,1,0,2,5,3]
输出:2 或 3
2.問題解決のアイデア
方法1
Javaでは、Hashテーブルを介してこれを実現し、ループを使用して配列内の要素をHashテーブルに追加できます。繰り返される数値が2回目に表示されると、add(num)の戻り値はfalseになります。 。これが私たちの仕事です。重複した値を返すことができます。
方法2
2番目の方法は、下付き文字を交換することによって実現することです。これも、より一般的に使用される方法です。
3.コードの実装
方法1
public static void main(String[] args) {
int[] sums = {
2,3,1,0,2,5,3};
int x = new demo_1().HashMethod(sums);
System.out.println(x); //输出: 2
}
/**
* 方法一 使用Hash表
*
*/
public int HashMethod(int[] nums) {
int res = -1;
Set<Integer> set = new HashSet<Integer>();
for(int num : nums){
if(!set.add(num)) {
res = num;
break;
}
}
return res;
}
方法2
public static void main(String[] args) {
ArrayRechecking aim = new ArrayRechecking();
int[] numbers={
5,1,2,3,2,1,4};
int length=7;
int[] duplication=new int[1];
boolean aa = aim.ArrayIndexMethod(numbers, length, duplication);
System.out.println(aa + " "+ duplication[0]);
}
class ArrayRechecking{
public boolean ArrayIndexMethod(int[] nums,int length,int[] Dvalue) {
// 判断数组和长度是否为空
if(nums == null|| length<=0) {
return false;
}
// 排除不符合题意的部分
for(int i=0; i<length;i++) {
if(nums[i]<0 || nums[i]>=length) {
return false;
}
}
for(int i=0; i<length;i++) {
while(nums[i] != i) {
if(nums[i] == nums[nums[i]]) {
// true说明有重复
Dvalue[0] = nums[i]; // 将重复值赋给数组存储
return true;
}
int temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return false;
}
}