編程題目:
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表示沒有找到
}
}