编程题目:
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表示没有找到
}
}