问题描述:
代码如下:和二分查找的思路一致,只不过多了一个遇到空字符的处理
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
public class StringSelect {
//在有空字符串的有序字符串数组中的查找
public static int find(String[] res,String key){//和二分查找的思路一致
int start=0;
int end=res.length-1;
if (res.length==0) return -1;
while (start<=end) {
int mid = start + (end - start) / 2;
int temp=mid;//用temp记录位置,方便遇到空格时的移动,防止造成死循环
while (res[mid].equals("")) {//处理遇到空格的情况
mid++;
if (mid > end) return -1;
}
if (res[mid].compareTo(key) > 0) {
end=temp-1;//利用temp定边界更加合理
}else if (res[mid].compareTo(key)<0){
start=temp+1;
}else return mid;
}
return -1;//找不到直接return -1
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入字符数组的个数");
int len=scanner.nextInt();
String[] res=new String[len];
for (int i = 0; i <len ; i++) {
// res[i]=scanner.nextLine();
try {
res[i]=buf.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(Arrays.toString(res));
System.out.println("请输入目标字符串");
// String target=scanner.next();
String target= null;
try {
target = buf.readLine();
} catch (IOException e) {
e.printStackTrace();
}
int result=find(res,target);
System.out.println(result);
}
}
运行示例结果截图: