35.找出數組arr[1000]中相同數值的元素

編程題目:

35.有一數組 arr[1000]存放了1000 個數,這 1000個數取自1-999, 且只有兩個相同的數,剩下的 998個數不同, 寫一個搜索算法找出相同的那個數的值(請用 JAVA編程實現,注意空間效率和時間效率儘可能優化)。

示例代碼:

package program.calculation.exercise35;

/**
 * 35.有一數組 a[1000]存放了1000個數,這 1000個數取自1-999, 且只有兩個相同的數,剩下的 998個數不同, 
 *  寫一個搜索算法找出相同的那個數的值(請用 JAVA編程實現,注意空間效率和時間效率儘可能優化)。
 */

public class SearchNumber {
	public static void main(String[] args) {
	
		int[] arr = new int[1000];
		//先定義998個不相同的數,最後一個數字用於測試
		for(int i=0;i<arr.length-1;i++){
			arr[i] = i+1;
		}
		arr[999] = 666;//測試數據
		result(arr);
	}
	
	//調用折半查找的方法實現查找相同元素
	private static void result(int arr[]){
		
		//使用折半查找需要先進行排序
		int lower = 0;
		int upper = arr.length-1;
		quickSort(lower,upper,arr);
		
		for (int i=0;i<arr.length;i++) {
			int num = arr[i];
			arr[i] = 0; //把不是相同的數字全置爲0
			int result = binarySearch(arr, num);
			if(result != -1){
				System.out.println("查找成功,相同數字是:"+arr[result]);
			}
		}
	}
	
	//快速排序
	private static void quickSort(int lower, int upper, int[] arr) {
		
		if(lower < upper){
			int middle = getMiddle(lower,upper,arr);
			quickSort(lower, middle-1, arr);
			quickSort(middle, upper, arr);
		}
		
	}

	private static int getMiddle(int lower, int upper, int[] arr) {
		
		while (lower < upper) {
			while (lower < upper && arr[lower] <= arr[upper]) {
				lower++;
			}
			if(lower < upper){
				int temp = arr[lower];
				arr[lower] = arr[upper];
				arr[upper] = temp;
			}
			while (lower < upper && arr[lower] <= arr[upper]) {
				upper--;
			}
			if(lower < upper){
				int temp = arr[lower];
				arr[lower] = arr[upper];
				arr[upper] = temp;
			}
		}
		
		return lower;
	}
	
	//折半查找
	private static int binarySearch(int[] arr,int num){
		
		int lower = 0;
		int upper = arr.length-1;
		while (lower <= upper) {
			int middle = (lower+upper)/2;
			if(arr[middle] < num){
				lower = middle+1;
			}else if(arr[middle] > num){
				upper = middle-1;
			}else{
				return middle;
			}
		}
		return -1;//返回找到的數據的位置,返回-1表示沒有找到
	}
	
}

結果顯示:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章