携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 9 天,点击查看活动详情。
稀疏数组搜索
原题地址
稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。
示例1:
输入: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""],
s = "ta"
输出:-1
说明: 不存在返回-1。
示例2:
输入:words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""],
s = "ball"
输出:4
提示:
words
的长度在[1, 1000000]
之间
思路分析
方法一
- 分析题目可以得知,题目的目的是为了寻找数组
words
中与字符串s
的位置,若不存在则返回-1
; - 很容易想到数组的
findIndex
方法,使用数组API
返回即可。
方法二
- 遍历数组来寻找与
s
相同的数组中的元素; - 若有相同的,则返回
i
,若没有则返回-1
。
方法三
- 上述两种方法都是走的通用的普通的方式,跟数组没有关系;
- 题目中的数组是已经排序的数组,因此可以使用二分查找;
- 因为是稀疏数组,因此需要额外处理为空的元素。在循环得到
mid
后,需要判断words[mid]
是否为空,若为空再进行移动; - 然后再执行正常的二分查找即可。
AC 代码
方法一
/**
* @param {string[]} words
* @param {string} s
* @return {number}
*/
var findString = function(words, s) {
return words.findIndex(item => item === s)
};
结果:
- 执行结果: 通过
- 执行用时:60 ms, 在所有 JavaScript 提交中击败了71.34%的用户
- 内存消耗:41.4 MB, 在所有 JavaScript 提交中击败了38.41%的用户
- 通过测试用例:28 / 28
方法二
/**
* @param {string[]} words
* @param {string} s
* @return {number}
*/
var findString = function(words, s) {
for(let i = 0; i < words.length; i++) {
if(words[i] === s) {
return i
}
}
return -1
};
结果:
- 执行结果: 通过
- 执行用时:88 ms, 在所有 JavaScript 提交中击败了6.10%的用户
- 内存消耗:41.4 MB, 在所有 JavaScript 提交中击败了50.00%的用户 = 通过测试用例:28 / 28
方法三
/**
* @param {string[]} words
* @param {string} s
* @return {number}
*/
var findString = function(words, s) {
let start = 0
let end = words.length - 1
while (start <= end) {
let mid = (start + end) >> 1
while (mid > start && words[mid] === '') mid--
if (words[mid] > s) {
end = mid - 1
} else if (words[mid] < s) {
start = mid + 1
} else {
return mid
}
}
return -1
};
结果:
- 执行结果: 通过
- 执行用时:60 ms, 在所有 JavaScript 提交中击败了71.34%的用户
- 内存消耗:41.6 MB, 在所有 JavaScript 提交中击败了16.46%的用户
- 通过测试用例:28 / 28