1. 题目

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

示例1:输入: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ta"输出:-1说明: 不存在返回-1。示例2:输入:words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ball"输出:4提示:
words的长度在[1, 1000000]之间

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sparse-array-search-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 将非空字符串和其序号,存起来
  • 二分查找字符串,返回其序号
class Solution {public:int findString(vector<string>& words, string s) {vector<pair<string,int>> w_id;for(int i = 0; i < words.size(); ++i)if(words[i] != "")w_id.push_back({words[i],i});int l = 0, r = w_id.size()-1, mid;while(l <= r){mid = l+((r-l)>>1);if(s < w_id[mid].first)r = mid-1;else if(s > w_id[mid].first)l = mid+1;elsereturn w_id[mid].second;}return -1;}
};

  • 上面画蛇添足了,直接遍历过一遍了,还二分查找。。
  • 直接二分查找如下:需要对空字符串进行处理跳过,mid 也是挪至非空处
class Solution {public:int findString(vector<string>& words, string s) {int l = 0, r = words.size()-1, mid;while(l <= r){while(l <= r && words[l]=="")l++;while(l <= r && words[r]=="")r--;mid = l+((r-l)>>1);while(l <= mid && words[mid]=="")mid--;// while(r >= mid && words[mid]=="") //这样写也行//   mid++;if(s < words[mid])r = mid-1;else if(s > words[mid])l = mid+1;elsereturn mid;}return -1;}
};

程序员面试金典 - 面试题 10.05. 稀疏数组搜索(二分查找)相关推荐

  1. LeetCode Algorithm 面试题 10.05. 稀疏数组搜索

    面试题 10.05. 稀疏数组搜索 Ideas 没啥好说的,二分搜索就完了,注意过滤空字符串. Code Python from typing import Listclass Solution:de ...

  2. 程序员面试金典 - 面试题 10.03. 搜索旋转数组

    题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 搜索旋转数组.给定一个排序后的数组 ...

  3. 程序员面试金典 - 面试题 10.11. 峰与谷

    题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 在一个整数数组中,"峰& ...

  4. 程序员面试金典 - 面试题 10.03. 搜索旋转数组(二分查找)

    1. 题目 搜索旋转数组.给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次了,次数不详. 请编写代码找出数组中的某个元素,假设数组元素原先是按升序排列的.若有多个相同元素,返回索引值最小 ...

  5. 程序员面试金典 - 面试题 16.05. 阶乘尾数(5的因子)

    1. 题目 设计一个算法,算出 n 阶乘有多少个尾随零. 示例 1: 输入: 3 输出: 0 解释: 3! = 6, 尾数中没有零.示例 2: 输入: 5 输出: 1 解释: 5! = 120, 尾数 ...

  6. 程序员面试金典 - 面试题 08.05. 递归乘法(位运算)

    1. 题目 递归乘法. 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘. 可以使用加号.减号.位移,但要吝啬一些. 示例1:输入:A = 1, B = 10输出:10示例2:输入:A = ...

  7. 程序员面试金典 - 面试题 03.05. 栈排序(两栈)

    1. 题目 栈排序. 编写程序,对栈进行排序使最小元素位于栈顶. 最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中. 该栈支持如下操作:push.pop.peek 和 ...

  8. 程序员面试金典 - 面试题 02.05. 链表求和

    1. 题目 给定两个用链表表示的整数,每个节点包含一个数位. 这些数位是反向存放的,也就是个位排在链表首部. 编写函数对这两个整数求和,并用链表形式返回结果. 示例: 输入:(7 -> 1 -& ...

  9. 程序员面试金典 - 面试题 17.05. 字母与数字(哈希map+思维转换)

    1. 题目 给定一个放有字符和数字的数组,找到最长的子数组,且包含的字符和数字的个数相同. 返回该子数组,若存在多个最长子数组,返回左端点最小的.若不存在这样的数组,返回一个空数组. 示例 1: 输入 ...

最新文章

  1. echart x轴标签偏移_移动端H5页面滑动手势X轴实例
  2. Spring Boot中验证码实现kaptcha
  3. DayDayUp:追梦赤子心——1024,你好!程序猿们的节日!
  4. 设计模式学习笔记(1)之单例模式
  5. 28 | 案例篇:一个SQL查询要15秒,这是怎么回事?
  6. 求二维数组的子数组中的最大值!
  7. ios15之取消UITabbleViewCell的高亮效果
  8. 在你的网站集成Wiki系统 WikiPlex
  9. Linux内核分析 - 网络[十二]:UDP模块 - 收发
  10. Oracle——集合运算
  11. python如何执行代码漏洞_在漏洞利用Python代码真的很爽
  12. 数字电子技术期末考试思维导图
  13. Null(空值)和 Undefined(未定义)
  14. idea TODO注释功能的使用
  15. 香港流行乐黄金二十年——经典歌手(音乐人)全面回顾 一
  16. 作为技术人员,我是如何安排学习的
  17. linux系统mtd移植,文件系统 之 移植mtd-utils工具包
  18. 相位展开(phase unwrapping)
  19. 使用纯css做一个播放器
  20. Lambda表达式到底是什么?——简单了解Lambda表达式

热门文章

  1. 集合添加元素python_Python基础:列表、字典、元组、集合、添加和删除元素,增删...
  2. 剑指offer:二叉树中和为某一值的路径
  3. vue php 文件上传,使用vue.js和laravel上传文件
  4. 第五季2:STA模式USB-WIFI网卡移植与测试
  5. VisualStudioAddIn2017.vsix的下载安装和使用
  6. (原)PyTorch中使用指定的GPU
  7. 【LeetCode】053. Maximum Subarray
  8. 调用exe文件(一般处理登陆安全窗口)+睡眠等待(--------------------)
  9. 平面方程(Plane Equation)
  10. #include 中的stat.h文件到底在哪个目录下面?