题目:
给定一个字符串数组 strs[],在strs 中有些位置为 null,但在不为 null 的位置上,其字符串是按照字典顺序由小到大依次出现的。在给定一个字符串 str,请返回str在strs中出现的最左的位置。
举例:
strs = [null,"a",null,"a",null,null,"b"] str="a" 返回1
strs = [null,"a",null,"a",null,null,"b"] str=null 返回-1 只要str为null,就返回-1
strs = [null,"a",null,"a",null,null,"b"] str="d" 返回 -1
思路:
遍历字符串数组,然后逐一比较,找到就返回下标,找不到就返回 -1。
代码实现:
public static int getIndex(String[] strs, String str) {
if (strs == null || strs.length ==0 || str == null) {
return -1;
}
for (int i = 0; i < strs.length; i++) {
if (str.equals(strs[i])) {
return i;
}
}
return -1;
}
使用二分查找:
public static int getIndex1(String[] strs, String str) {
if (strs == null || strs.length == 0 || str == null) {
return -1;
}
int res = -1;
int left = 0;
int right = strs.length - 1;
int mid = 0;
int i = 0;
//二分法
while (left <= right) {
//首先mid设置为 (left+right)/2
mid = (left + right) / 2;
//如果这时候 mid位置的字符串不为空且等于str,就说明找到了,但可能mid左边还有
if (strs[mid] != null && strs[mid].equals(str)) {
res = mid;
right = mid -1;
//如果mid位置的字符串不为空
} else if (strs[mid] != null) {
//且mid位置的字符串在 str 字符串左边,说明str在右半部分
if (strs[mid].compareTo(str) < 0) {
left = mid + 1;
//且mid位置的字符串在 str 字符串右边,说明str在左半部分
} else {
right = mid -1;
}
} else {
i = mid;
//从右向左遍历左半区
while (strs[i] == null && --i >= left) ;
if (i < left || strs[i].compareTo(str) < 0) {
left = mid + 1;
} else {
res = strs[i].equals(str) ? i : res;
right = i -1;
}
}
}
return res;
}