配列内の重複する番号を検索します(剣はオフィスを指します)

1.対象要件

長さnの配列nums内のすべての数値は、0〜n-1の範囲です。配列内のいくつかの数字が繰り返されていますが、何回繰り返されているのか、各配列が何回繰り返されているのかわかりません。配列内で重複する番号を見つけてください。

 输入: [2,3,1,0,2,5,3]
 输出:23

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;
		}
	}

おすすめ

転載: blog.csdn.net/weixin_44676935/article/details/107214116