leetcode 面试题 10.05. 稀疏数组搜索 | 刷题打卡

193 阅读1分钟

一、题目描述

稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。

示例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 春招闯关活动」, 点击查看 活动详情