一般涉及到有序序列的查找,都要考虑一下能否使用二分查找来加速,这是查找优化的一项重要内容。看一个题目:
有个排序后的字符串数组,其中散布着一些空字符串,请你写一个方法,找出是否存在给定的字符串(不是空串),如果存在则返回索引。
这个题什么意思呢,就是字符串整体是有序的,但是中间零散有一些空串,例如这种结构。
{"a", "", "ac", "", "ad", "b", "", "ba"}
那这是能不能用二分查找呢?当然可以我们可以假定遇到空串就往左边走或者右边走,直到找到不是空的串,判断一下是大了还是小了,如果小了则向右折半,反之向左。
static int findIndexOf(String[] arr, String p) {
int begin = 0, end = arr.length - 1;
while (begin <= end) {
int indexMid = begin + ((end - begin) >> 1);
while (arr[indexMid].equals("")) {
indexMid++;
if (indexMid > end) {
return -1;
}
}
if (arr[indexMid].compareTo(p) > 0) {
end = indexMid - 1;
} else if (arr[indexMid].compareTo(p) < 0) {
begin = indexMid + 1;
} else {
return indexMid;
}
}
return -1;
}
再写一个测试类看一下
public static void main(String[] args) {
String[] arr = {"a", "", "ac", "", "ad", "b", "", "ba"};
int res = findIndexOf(arr, "ac");
System.out.println(res);
}