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表示没有找到
	}
	
}

结果显示:

在这里插入图片描述

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