题目
有个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,找出给定字符串(肯定不是空字符串)的索引
算法
其实就是用二分查找,本身字符串数组就是有序的,与查找数字的不同之处就在于字符串的大小比较方式不一样罢了,还有就是这里还有空字符串,所以选取mid时,如果遇到空字符串,使其往下移动一位就好了。
代码片段
public class PinduoduoOne {
public static int search(String[] s, String target) {
int left = 0, right = s.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
// 记录最开始的mid
int originMid = mid;
while (mid <= right && s[mid].equals("")) {
mid++;
}
// 如果mid超过了搜索right边界,说明mid~right部分全为空串
if (mid > right) {
right = originMid - 1;
continue;
}
// target > [mid]
if (target.compareTo(s[mid]) > 0) {
left = mid + 1;
} else if (target.compareTo(s[mid]) < 0) {
right = mid - 1;
} else {
return mid;
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(search(new String[]{"ac", "", "", "", "", "", "", "", "", "ad", "b", "", "ba"}, "ac"));
System.out.println(search(new String[]{"", "", "ac", "", "", "", "", "", "", "", "", "ad", "b", "", "ba"}, "ac"));
}
}