編程題目:
35.有一數組 a[1000]存放了1000 個數,這 1000個數取自1-999, 且只有兩個相同的數,剩下的 998個數不同, 寫一個搜索算法找出相同的那個數的值(請用 JAVA編程實現,注意空間效率和時間效率儘可能優化)。
示例代碼:
package program.calculation.exercise35;
public class SearchNumber {
public static void main(String[] args) {
int[] arr = new int[1000];
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;
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;
}
}
結果顯示: