面试必会的几道算法

简介: 面试必会的几道算法

web前端面试题库 VS java后端面试题库大全

前言 web前端面试题库 VS java后端面试题库大全

金三银四,又到了换工作的最佳时机,我幻想着只要跳个槽,就能离开这个”鸟地方“,拿着更多的钱,干着最爽的事...

然而现实总是残酷的,最近有个学妹在换工作,面试前什么手写Priomisevue双向绑定原理,webpack优化方式,准备了一大堆,本以为成竹在胸,结果却在算法上吃了大亏,心仪的offer没有拿到,一度怀疑人生。到底是什么算法题能让面试官对妹子说出你都工作3年了,这个算法题都不会?这样的狠话?

有效的括号问题  web前端面试题库 VS java后端面试题库大全

这是一道leetcode上的原题,本意是在考察候选人对数据结构的掌握。来看看题目

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

示例

示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true

解题信息

如果咱们确实没有刷过算法,不知道那么多套路,通过题目和示例尽可能的获取到更多的信息就很重要了。

根据题目推断出:

  1. 字符串s的长度一定是偶数,不可能是奇数(一对对匹配)。
  2. 右括号前面一定跟着左括号,才符合匹配条件,具备对称性。
  3. 右括号前面如果不是左括号,一定不是有效的括号。

暴力消除法

得到了以上这些信息后,胖头鱼想既然是[]{}()成对的出现,我能不能把他们都挨个消除掉,如果最后结果是空字符串,那不就意味着符合题意了吗?

举个例子

输入:s = "{[()]}"
第一步:可以消除()这一对,结果s还剩{[]}
第二步: 可以消除[]这一对,结果s还剩{}
第三步: 可以消除{}这一对,结果s还剩'' 所以符合题意返回true

代码实现

const isValid = (s) => {
  while (true) {
    let len = s.length
    // 将字符串按照匹配对,挨个替换为''
    s = s.replace('{}', '').replace('[]', '').replace('()', '')
    // 有两种情况s.length会等于len
    // 1. s匹配完了,变成了空字符串
    // 2. s无法继续匹配,导致其长度和一开始的len一样,比如({],一开始len是3,匹配完还是3,说明不用继续匹配了,结果就是false
    if (s.length === len) {
      return len === 0
    }
  }
}

暴力消除法最终还是可以通过leetcode的用例,就是性能差了点,哈哈

栈解题法

解题信息中的第2条强调对称性,而栈(后入先出)入栈和出栈恰好是反着来,形成了鲜明的对称性。

入栈:abc,出栈:cba

abc
cba

所以可以试试从的角度来解析:

输入:s = "{[()]}"
第一步:读取ch = {,属于左括号,入栈,此时栈内有{
第二步:读取ch = [,属于左括号,入栈,此时栈内有{[
第三步:读取ch = (,属于左括号,入栈,此时栈内有{[(
第四步:读取ch = ),属于右括号,尝试读取栈顶元素(和)正好匹配,将(出栈,此时栈内还剩{[
第五步:读取ch = ],属于右括号,尝试读取栈顶元素[和]正好匹配,将[出栈,此时栈内还剩{
第六步:读取ch = },属于右括号,尝试读取栈顶元素{和}正好匹配,将{出栈,此时栈内还剩''
第七步:栈内只能'',s = "{[()]}"符合有效的括号定义,返回true

代码实现

const isValid = (s) => {
  // 空字符串符合条件
  if (!s) {
    return true
  }
  const leftToRight = {
    '(': ')',
    '[': ']',
    '{': '}'
  }
  const stack = []
  for (let i = 0, len = s.length; i < len; i++) {
    const ch = s[i]
    // 左括号
    if (leftToRight[ch]) {
      stack.push(ch)
    } else {
      // 右括号开始匹配
      // 1. 如果栈内没有左括号,直接false
      // 2. 有数据但是栈顶元素不是当前的右括号
      if (!stack.length || leftToRight[ stack.pop() ] !== ch) {
        return false
      }
    }
  }
  // 最后检查栈内还有没有元素,有说明还有未匹配则不符合
  return !stack.length
}

暴力解法虽然符合我们日常的思维,但是果然还是栈结构解法好了不少。

结尾 web前端面试题库 VS java后端面试题库大全

面试中,算法到底该不该成为考核候选人的重要指标咱们不吐槽,但是近几年几乎每个大厂都将算法放进了前端面试的环节,为了获得心仪的offer,重温数据结构,刷刷题还是很有必要的,愿你我都被算法温柔以待。

希望能一直给大家分享实用、基础、进阶的知识点,一起早早下班,快乐摸鱼。

web前端面试题库 VS java后端面试题库大全

相关文章
|
22天前
|
存储 算法 编译器
米哈游面试算法题:有效的括号
米哈游面试算法题:有效的括号
22 0
|
2月前
|
开发框架 算法 搜索推荐
C# .NET面试系列九:常见的算法
#### 1. 求质数 ```c# // 判断一个数是否为质数的方法 public static bool IsPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) { return false; } } return true; } class Progr
60 1
|
22天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
35 0
|
1天前
|
存储 缓存 算法
面试遇到算法题:实现LRU缓存
V哥的这个实现的关键在于维护一个双向链表,它可以帮助我们快速地访问、更新和删除最近最少使用的节点,同时使用哈希表来提供快速的查找能力。这样,我们就可以在 O(1) 的时间复杂度内完成所有的缓存操作。哈哈干净利索,回答完毕。
|
2月前
|
算法
覃超老师 算法面试通关40讲
无论是阿里巴巴、腾讯、百度这些国内一线互联网企业,还是 Google、Facebook、Airbnb 等硅谷知名互联网公司,在招聘工程师的过程中,对算法和数据结构能力的考察都是重中之重。本课程以帮助求职者在短时间内掌握面试中最常见的算法与数据结构相关知识点,学会面试中高频算法题目的分析思路,同时给大家从面试官的角度来分析算法题的解答技巧,从而更有效地提升求职者的面试通过率。
15 3
覃超老师 算法面试通关40讲
|
2月前
|
存储 算法
【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
|
2月前
|
存储 机器学习/深度学习 算法
python常用算法,新手必会,面试必出
python常用算法,新手必会,面试必出
37 0
|
2月前
|
存储 算法 Java
【数据结构与算法】2、链表(简单模拟 Java 中的 LinkedList 集合,反转链表面试题)
【数据结构与算法】2、链表(简单模拟 Java 中的 LinkedList 集合,反转链表面试题)
43 0
|
3月前
|
机器学习/深度学习 算法 Java
递归算法还有哪些是你不知道的----【探讨Java经典遍历问题和面试题】
递归算法还有哪些是你不知道的----【探讨Java经典遍历问题和面试题】
32 1
|
4月前
|
存储 缓存 算法
数据结构与算法面试题:实现一个 LRU 缓存,支持如下操作:获取值、更新值、删除键值对和插入键值对
数据结构与算法面试题:实现一个 LRU 缓存,支持如下操作:获取值、更新值、删除键值对和插入键值对
28 0