大前端

Leetcode第253场周赛解题分享 第二题 java堆没学呢,先空着...

python

Leetcode第253场周赛解题分享 第二题 java堆没学呢,先空着...

难度:简单 题目 给你一个字符串 s 和一个字符串数组 words ,请你判断 s 是否为 words 的 前缀字符串 。 字符串 s 要成为 words 的 前缀字符串 ,需要满足:s 可以由 words 中的前 k(k 为 正数 )个字符串按顺序相连得到,且 k 不超过 words.length 。 如果 s 是 words 的 前缀字符串 ,返回 true ;否则,返回 false 。 提示: * 1 <= words.length

刷穿剑指offer-Day03-整数III-快速幂

面试

刷穿剑指offer-Day03-整数III-快速幂

昨日回顾 昨天我们通过两道题目,讲解了二进制与位运算的操作。 偏底层的东西确实略显枯燥,但没办法,这就是面试官们的最爱,只能耐着性子学下去了。 那么今天作为整数的第三天,我们来讲讲关于取模与幂运算的操作吧。 来段前戏 先来一个解惑吧,我们经常在做算法题目的时候,会遇到这么一句话: 答案可能很大,所以返回对 10 ^ 9 + 7 取余 的结果。 10 ^ 9 + 7到底有什么含义呢?答案是....没有含义。what,没有意义为什么导出都在用它? 这里要解释下,一般情况下我们都会在算法时,为了避免溢出,且不用频繁执行取模操作,希望使用一个足够大且为质数的数字进行取模,这样可以减少冲突。 什么冲突?你蒙对答案的冲突... 比如一道题,因为数字可能比较大,需要你返回对2取模的结果。那么答案就只有0和1,你蒙对答案的几率为50%,那还做什么算法!开篇讲一个小知识,来帮助我们快速进入学习状态。 关于取模 关于取模有什么说的呢?大家只需要记住一个公式即可: (x * y ) % z ==>

刷穿剑指offer-Day07-数组III 前缀和知识讲解!

大前端

刷穿剑指offer-Day07-数组III 前缀和知识讲解!

昨日回顾 昨天的数组专题,我们针对双指针中的特殊场景----滑动窗口思维进行了学习。 在解题思维中,罗列出了滑动窗口的模板的使用方式,通过: 1. 确定左右边界 2. 查找窗口滑动条件的方式 3. 按照题意套模板 即可可以轻松解决滑窗相关的题目。 滑动窗口的力所不及 在套模板的同时,大家是否考虑过,假设题目同样是求连续的子数组,但是在数组中出现了负数,那这种情况下还可以使用滑动窗口么? 答案是不行的,为什么? 我们窗口滑动的条件是什么,while窗口内元素超过或者不满足条件时移动,但如果数组存在负数,遇到不满足题意的时候,我们应该移动窗口左边界,还是扩大窗口右边界从而寻找到符合条件的情况呢? 当一种场景存在多种可能时,显然就是当前的算法不适配解题。今天就为大家介绍另一种数组中常用的算法----前缀和。 前缀和的解题思想 前缀和的题目解题思维比较固定,即当我们循环数组到下标N时,需要用到数组前N-1项的计算的结果(这里不一定非要是和,也可能是积等),此时我们就该考虑是否应该通过计算数组循环过程中的累计值的方式简化解题,如此便有了前缀和的解题思想。 了解了

刷穿剑指offer-Day08-字符串I 字符串知识总结与题型讲解

python

刷穿剑指offer-Day08-字符串I 字符串知识总结与题型讲解

前文回顾 上一章我们学习了数组相关的知识与解题,并针对例题讲解了双指针和前缀和的解题思想。其中重点针对双指针的特殊场景滑动窗口进行了细致讨论和解题模板梳理。到这里一些初入刷题不久的朋友也许要想,那是不双指针就只能用来刷数组的题目,其他的就不适用了呢?完全不是... 针对某一类数据结构的算法题目,很多时候解题思维是通用的,不仅是数组会用到双指针,链表、字符串等等同样适用。而且我们在解某一种题目时,经常会通过将该结构转化为其他数据结构的方式来完成解题,而这种场景出现最多的就是字符串类型了。 字符串题目解析 字符串普遍认为它是不可变的,所以如果单纯考察字符串,能涉及到的知识点未免太过狭隘了,难道面试的时候算法题目考些诸如:字符串切片求子串、两个字符串判断是否相等、字符串倒序输出?醒醒,别做梦了,但凡喝酒配点花生米,也不至于醉成这样啊.... 力扣上的字符串题目有536道,但这个分类是有问题的,它将所有入参为字符串的题目都分到的这个类型里面,但其实几乎所有字符串的题目都是通过以下几类来完成的,让我们来仔细划分下: 数组 由于字符串是有字符组成的,而算法题中的字符串一般都只会包含

刷穿剑指offer-Day09-字符串II 使用哈希表解决字符串题目

python

刷穿剑指offer-Day09-字符串II 使用哈希表解决字符串题目

昨日回顾 从昨天开始,我们进入了第三章字符串的学习。然而所为的字符串专题,在讲解后,大家应该了解到字符串的题目,其实都是将字符串转化为其他数据类型后,再进行解题的过程。例如字符串转化为数组、栈、哈希表、队列等等。 昨天在文末,将剑指offer的015题作为课后作业留给大家下来练习。不知道有多少人自觉完成了呢?我猜没几个.... 那么今天开篇,想讲解一下昨天的作业吧。 难度:中等 题目: 给定两个字符串 s 和 p,找到 s 中所有 p 的 变位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 变位词 指字母相同,但排列不同的字符串。 提示: * 1 <= s.length, p.length <= 3 * 10 ^ 4 * s 和

刷穿剑指offer-Day10-字符串III 回文串专题

python

刷穿剑指offer-Day10-字符串III 回文串专题

昨日回顾 昨天我们使用哈希表解决了字符串的变位匹配问题,主要是通过哈希表的方式可以快速检索历史内容,从而达到空间换时间的思想完成解题。这种空间使用空间换时间的思路,在很多场景都会使用到。 那么今天是字符串专题的最后一天,来让我们一起讲讲回文串专题。 回文串的暴力思路 所谓回文串,就是一段字符串,不管正序还是逆序,读出来的内容都是一样的。当然,在字符串中可能会存在空格、逗号等特殊字符串需要我们过滤。 刚接触这类题目的时候,感觉这种题对于python来说没有啥难度啊,因为python中字符串的逆序简直不要太简单: strs == strs[::-1] 这样一个简单的公式,就能完成字符串正序和逆序的比较,看起来效率还挺高的。 你说它们中间有特殊字符?没关系,创建一个空的字符串,然后遍历当前字符串comp,将合规的字符添加至comp中,然后在字符串逆序比较就好了啊。 虽然Java字符串使用StringBuffer逆序代码会稍微多一点,但是总体还是比较简单的。然而,这种方式真的好么?让我们来通过一道题目分析下吧! 难度:简单 题目 给定一个字符串 s ,验证 s 是否是

刷穿剑指offer-Day17-栈I 栈的使用与基础题型!

python

刷穿剑指offer-Day17-栈I 栈的使用与基础题型!

刷穿剑指offer-Day17-栈I 栈的使用与基础题型 栈的介绍 栈(stack) 本身是一种简单、常用的数据结构,它常常用来和队列进行比较。 * 队列: 先入先出 * 栈: 后入先出 栈的所有操作都发生在栈顶,其实就三个操作,入栈(压栈)、出栈(弹栈)、获取栈顶元素。 Python & Java 中的栈 Java中存在Stack的数据结构,但Python是没有栈的,它们的实现与操作方式如下: 操作PythonJava说明初始化Stack<Integer> stack = new Stack<>();stack = []入栈stack.push(1);stack.append(1)出栈stack.pop();stack.pop()为空时报错获取栈顶元素stack.peek();stack[-1]

刷穿剑指offer-Day20-队列I 队列的使用与基础题型!

大前端

刷穿剑指offer-Day20-队列I 队列的使用与基础题型!

队列的介绍 队列(queue)是一种简单、常用的数据结构,在上一章栈的学习中,我们已经提到了队列这种数据结构。 * 队列: 先入先出 * 栈: 后入先出 队列的操作和我们日常生活中的排队是很像的,先排队的人先得到服务。 结合生活中的场景,我们应该理解,新来一个人加入排队大军,那么肯定是从队尾开始排起,而出队则是发生在队首。 Python & Java 中的队列 队列分为普通的单向队列和双端队列,在Python中一般使用collections方法中内置的deque这种双端队列来解题。 而在Java中接口Queue可以使用LinkedList实现单向队列,ArrayDeque实现双端队列。 操作PythonJava说明初始化from collections import deque<br />queue = deque()Queue<Integer> queue = new LinkedList<>();插入元素queue.append(1)queue.add(1)

刷穿剑指offer-Day21-队列II 使用队列实现广度优先搜索!

python

刷穿剑指offer-Day21-队列II 使用队列实现广度优先搜索!

昨日回顾 昨天,我们介绍了队列的基础知识,并分别学习了Python与Java中队列的操作方法。 在此基础上,通过两道简单的队列题,掌握了基本的入队与出队操作。然而,队列的题目可不只是简单按照顺序出入队那么简单。 队列有一个最为经典的使用方式,就是 广度优先搜索( BFS) 。而广度优先搜索中,又数二叉树的遍历更为常用。今天我们就通过几道二叉树的题目,来掌握广度优先搜索的使用。 二叉树什么时候该使用广度优先搜索呢?请大家注意这几个关键字: 每层、最大深度、最左、最右 。 二叉树BFS模板 虽然昨天我们学习的队列题目,看似与二叉树没有关系,但其实二叉树的广度优先搜索,是存在解题模板可以套用的。 对于基本的二叉树层序遍历,使用如下的模板基本就可以解决所有问题了: 初始化队列 queue if root不为空: 将root加入队列 while queue 不为空: length = queue的长度 for (int i = 0; i < lg; i++) q = queue队首出队

刷穿剑指offer-Day23-树II 树的深度优先搜索!

面试

刷穿剑指offer-Day23-树II 树的深度优先搜索!

昨日回顾 昨天我们学习了树的一些基础名词与分类,很多人想问,为什么很多公司的手撕算法环节都会选择树这个数据类型来考察面试者呢? 因为树中包含的知识太多了。我们在昨天介绍的树的前中后续遍历中,涉及到递归和迭代两种方式,单单这些就考察了我们对递归、栈、链表知识。更别说之前介绍过树的逐层遍历(广度优先搜索),以及之后要介绍的深度优先搜索。 说了这么多,只是为了再次强调树这个知识点的重要性。那么就要提问了,昨天留的94和145题树的中序和后续遍历,大家是否用两种方法完成了呢?我猜基本都没有。前序和中序在迭代的写法中几乎没有差异,然而后续遍历却略显复杂, 开篇先简单带着大家回顾下树的后续遍历知识吧。 难度:简单 题目: 给定一个二叉树,返回它的 后序 遍历。 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 分析 对于递归的代码前中后序遍历,只需要修改val添加的位置即可。 但对于迭代的操作,则后续遍历稍显麻烦。

532.数组中的k-diff数对 Python&Java 哈希表、双指针双解

java

532.数组中的k-diff数对 Python&Java 哈希表、双指针双解

https://leetcode.cn/problems/k-diff-pairs-in-an-array/solution/by-qingfengpython-jpv4/ 难度:中等 题目: 给定一个整数数组和一个整数k,你需要在数组里找到 不同的k-diff 数对,并返回不同的 k-diff 数对 的数目。 这里将k-diff数对定义为一个整数对 (nums[i], nums[j]),并满足下述全部条件: * 0 <= i < j < nums.length * |nums[i] - nums[j]| == k 注意,|val| 表示 val 的绝对值。 提示: * 1 <= nums.length <= 10

你掌握迭代器和可迭代对象了么?不,你没有!

python

你掌握迭代器和可迭代对象了么?不,你没有!

今天和大家聊聊Python的迭代器和可迭代对象。 学前知识复习 在学习生成器之前,我们需要先了解二者的关系: 迭代器一定是可迭代对象,但可迭代对象不一定是迭代器。 可迭代对象 在Python中,万物接对象! str, list, tuple, dict, set等等只要对象中包含了__iter__()方法的,都是可迭代对象。 那么,如何查看对象是否包含__iter__()方法,又如何证明是否为可迭代对象呢? 最简单的方式莫过于: from collections.abc import Iterable print('__iter__' in dir(10)) # False print(isinstance(10, Iterable)) # False print('__iter__' in dir('abc'