一、题目描述
稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。
示例1:
输入: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ta"
输出:-1
说明: 不存在返回-1。
示例2:
输入:words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ball"
输出:4
提示:
- words的长度在[1, 1000000]之间
二、题目分析
因为题目要求,这里确定要使用二分法。使用二分法的前提是字符串已经排好了序,直接套用二分法之前先要考虑对于空字符串的处理,因为字符串排序时所有的字符串都大于空字符串,这里思路是遇到空字符串直接将指针右移并且判断边界。
除此之外,使用直接遍历查找代码量会更少一些。
二分法
三、实现代码
- 二分法
var findString = function(words, s) {
let low = 0,
high = words.length - 1,
ans = -1;
while (low <= high) {
while (!words[low] && low < high) low++;
while (!words[high] && low < high) high--;
let mid = low + ( (high - low) >> 1 );
while (!words[mid] && mid < high) mid++;
if (words[mid] === s) {
ans = mid;
break;
}
if (s < words[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return ans;
};
- 遍历查找
var findString = function (words, s) {
for (let i = 0; i < words.length; i++) {
if (words[i] && words[i] == s) {
return i;
}
}
return -1;
};
END
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情