数据结构 | 刷题 | 面试
刷题 | leetcode
大虎牙
一物不知 深以为耻 便求知若渴
展开
-
学习笔记 | 最小堆、“种草”
def HeadAdjust(nums, k, n): nums[0] = nums[k] i = 2*k while i <= n: if i < n and nums[i] > nums[i+1]: i += 1 if nums[0] <= nums[i]: break else: nums[k] = nums[i] ...原创 2020-07-29 18:12:07 · 172 阅读 · 0 评论 -
学习笔记 | python实现 数组所有子集的求解
问题已知数组如X=[1,2,3,4],输出其所有的子集,如[],[1],[2],[3],[4],[1,2],[2,3],[3,4],[1,2,3],[2,3,4],[1,2,3,4]…def getArraySubSet(originArray): """ :type originArray:list :rtype :listlist """ result = [[]] size = len(originArray) for i in range原创 2020-07-28 10:33:40 · 2023 阅读 · 0 评论 -
学习笔记 | 内存溢出、内存泄漏
内存溢出和内存泄漏1、内存溢出指程序申请内存时,没有足够的内存供申请者使用。内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误内存溢出原因:内存中加载的数据量过于庞大,如一次从数据库取出过多数据集合类中有对对象的引用,使用完后未清空,使得不能回收代码中存在死循环或循环产生过多重复的对象实体使用的第三方软件中的BUG启动参数内存值设定的过小2、内存泄漏内存泄漏是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存原创 2020-06-28 12:16:02 · 196 阅读 · 0 评论 -
学习笔记 | 全排列
LeetCode 46. 全排列给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]代码class Solution(object): def __init__(self): self.ans = [] self.n = 0 self.nums = None原创 2020-07-22 11:51:27 · 106 阅读 · 0 评论 -
学习笔记 | 数据结构 考研要点
第1章 绪论第2章 线性表第3章 栈和队列第4章 串第5章 树和二叉树第6章 图第7章 查找第8章 排序原创 2020-07-19 18:41:31 · 692 阅读 · 0 评论 -
学习笔记 | LeetCode 460. LFU缓存
LeetCode 460. LFU缓存请你为 最不经常使用(LFU)缓存算法设计并实现数据结构。它应该支持以下操作:get 和 put。get(key)- 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。put(key, value)- 如果键已存在,则变更其值;如果键不存在,请插入键值对。当缓存达到其容量时,则应该在插入新项之前,使最不经常使用的项无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,应该去除最久未使用的键。「项的使用次数」就是自插入该项以来对其调用原创 2020-07-11 20:19:22 · 157 阅读 · 0 评论 -
学习笔记 | Leetcode 146. LRU缓存机制
Leetcode 146. LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key)- 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数原创 2020-07-11 18:59:09 · 158 阅读 · 0 评论 -
学习笔记 | 详解TopK 问题
详解 TopK01 TopK 问题TopK 问题是在实际业务中经常出现的典型问题,例如微博的热门排行就属于 TopK 问题。TopK 一般是要求在 N 个数的集合中找到最小或者最大的 K 个值,通常 N 都非常得大。TopK 可以通过排序的方式解决,但是时间复杂度较高,一般是 O(nk),这里我们来看看更加高效的方法。如下图所示,首先取前 K 个元素建立一个大根堆,然后对剩下的 N-K 个元素进行遍历,如果小于堆顶的元素,则替换掉堆顶元素,然后调整堆。当全部遍历完成时,堆中的 K 个元素就是最小原创 2020-07-05 19:29:46 · 651 阅读 · 0 评论 -
学习笔记 | 详解字符串匹配
字符串匹配问题在面试时,字符串相关的问题经常作为算法考察题,下面来看字符串匹配的问题。先来了解一道常考的面试题:“判断给定字符串中的括号是否匹配”。一般面试题目的描述都比较简单,在解答前,可以跟面试官进一步沟通一下题目要求和细节。以这道题为例,可以跟面试官确认括号的范围,是不是只考虑大中小括号就可以,包不包括尖括号;对函数的入参和返回值有没有什么样的要求;需不需要考虑针对大文件的操作等。我们假定细化后本题的要求为:只考虑大中小括号;不考虑针对大文件的操作,以字符串作为入参,返回值为布尔类型原创 2020-07-05 19:14:10 · 226 阅读 · 0 评论 -
学习笔记 | 数据结构和算法 知识点思维导图
程序 = 数据结构 + 算法一 数据结构知识点01 队列和栈,需要了解它们的特点。队列是先进先出,栈是后进先出。02 表表,包括很多种,有占用连续空间的数组、用指针链接的单向和双向链表,首尾相接的循环链表、以及散列表,也叫哈希表。03 图图,在特定领域使用的比较多,例如路由算法中会经常使用到,图分为有向图、无向图及带权图,这部分需要掌握图的深度遍历和广度遍历算法,了解最短路径算法。04 树的内容树一般用作查找与排序的辅助结构,剩下两个部分都和树有关,一个是二叉树,一个是多叉原创 2020-07-05 18:27:54 · 2129 阅读 · 0 评论 -
学习笔记 | 前 K 个高频元素、优先队列、最小堆
class Solution(object): def topKFrequent(self, nums, k): """ :type nums: List[int] :type k: int :rtype: List[int] """ def shift(i,k): #维护最小堆 while True: t= 2*i+1 .原创 2020-07-01 19:28:09 · 140 阅读 · 0 评论 -
学习笔记 | 优先队列Priority Queue
优先队列(Priority Queue)特点能保证每次取出的元素都是队列中优先级别最高的。优先级别可以是自定义的,例如,数据的数值越大,优先级越高;或者数据的数值越小,优先级越高。优先级别甚至可以通过各种复杂的计算得到。应用场景从一堆杂乱无章的数据当中按照一定的顺序(或者优先级)逐步地筛选出部分乃至全部的数据。举例:任意一个数组,找出前 k 大的数。解法 1:先对这个数组进行排序,然后依次输出前 k 大的数,复杂度将会是 O(nlogn),其中,n 是数组的元素个数。这是一种直接的办法原创 2020-07-01 17:56:40 · 368 阅读 · 0 评论 -
学习笔记 | 在排序数组中查找元素的第一个和最后一个位置
class Solution(object): def searchRange(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ def findlow(nums,target,low,high): while low <= .原创 2020-07-01 17:30:10 · 108 阅读 · 0 评论 -
学习笔记 | 搜索旋转排序数组、二分查找
class Solution(object): def search(self, nums, target): """ :type nums: List[int] :type target: int :rtype: int """ low = 0 high = len(nums)-1 while low <= high: mid = low .原创 2020-07-01 16:45:24 · 81 阅读 · 0 评论 -
学习笔记 | 无重复字符最长子串
01 无重复字符最长子串- 快慢指针class Solution(object): def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ ans = 0 if not s: return ans i = 0 j = 0 d原创 2020-06-28 09:26:12 · 110 阅读 · 0 评论 -
学习笔记 | 贪心算法(贪婪算法)
贪心算法,是从问题的初始解开始,一步一步地做出当前最好的选择,逐步逼近问题的目标,尽可能地得到最优解,即使达不到最优解,也可以得到最优解的近似解。也就是说,它期望通过局部最优选择从而得到全剧最优的解决方案。在贪心算法中,我们需要注意的问题是:没有后悔药。一旦做出选择,不可以反悔。有可能得到的不是最优解,而是最优解的近似解、可行解。选择什么样的贪心策略,直接决定算法的好坏。01 利用贪心算法求解问题具有两个重要的特性:如果无法使用贪心算法,举出反例即可。归纳和反证法贪心选择所谓.原创 2020-06-24 20:32:52 · 975 阅读 · 0 评论 -
学习笔记 | 二叉树:前序遍历、中序遍历、后序遍历
二叉树:前序遍历、中序遍历、后序遍历class Node: def __init__(self, value=None, left=None, right=None): self.value = value self.left = left self.right = right # 右子树def preTraverse(root): ''' 前序遍历 ''' if root == None: r原创 2020-06-20 18:16:30 · 146 阅读 · 0 评论 -
学习笔记 | 测试杯子在哪个楼层破碎的问题
题目描述:有一种玻璃杯质量确定但未知,需要检测。有一栋100层的大楼,该种玻璃杯从某一层楼扔下,刚好会碎。现给你两个杯子,问怎样检测出这个杯子的质量,即找到在哪一层楼刚好会碎?题目分析:首先两个杯子的质量是相同的。如果杯子从第n层掉下来没有碎,那么从第小于n层的任意层丢下去都不会碎。如果杯子从第n层掉下来碎了,那么从第大于n层的任意层丢下去都会碎。一个扔出去但没有碎的杯子,可以继续被用于试验,扔下去碎了的杯子不能使用。最后找到杯子刚好碎了的楼层一定是在第X-1层扔下去没碎,加一层在第X原创 2020-06-07 16:19:55 · 1219 阅读 · 0 评论 -
学习笔记 | 最大公约数、最小公倍数
01 最大公约数def gcd(a, b): if b == 0: return a else: return gcd(b, a % b)if __name__ == "__main__": ans = gcd(3, 5) print(ans)输出 : 1辗转相减法def gcd(a, b): if a -...原创 2020-04-28 13:14:25 · 329 阅读 · 0 评论 -
学习笔记 | 解决Hash冲突的4种办法
因为HashMap的长度是有限的,当插入的Entry越来越多时,再完美的Hash函数也难免会出现index冲突的情况。a)开放地址法这个方法的基本思想是:当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。这个过程可用下式描述:Hi (key) = ( H (key)+ di ) mod m ( i = 1,2,……,k (k ≤ m – 1) )...原创 2020-04-27 16:57:54 · 457 阅读 · 0 评论 -
学习笔记 | C++结构体 字节对齐
目录什么是字节对齐?对齐准则又是什么?为什么要字节对齐呢?字节对齐对我们编程有什么启示?01 什么是字节对齐?02 对齐准则又是什么?03 为什么要字节对齐呢?04 字节对齐对我们编程有什么启示?...原创 2020-04-27 15:48:45 · 460 阅读 · 0 评论 -
学习笔记 | HashMap的底层原理
01 HashMap的底层原理HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。HashMap数组每一个元素的初始值都是Null。对于HashMap,我们最常使用的是两个方法:Get 和 Put。1. Put方法的原理我们需要利用一个哈希函数来确定Entr...原创 2020-04-23 23:09:14 · 207 阅读 · 0 评论 -
学习笔记 | 红黑树、B-树、B+树
二叉查找树BST、红黑树、B+树01 二叉查找树BST(又称二叉排序树)的特性左子树上所有结点的值均小于或等于它的根结点的值。右子树上所有结点的值均大于或等于它的根结点的值。左、右子树也分别为二叉排序树。二叉查找树多次插入新结点会导致不平衡现象。02 红黑树的特性和优势,在什么情况下需要变色、什么情况下需要旋转?红黑树Red Black Tree是一种自平衡的二叉查找树。...原创 2020-04-23 13:11:36 · 348 阅读 · 0 评论 -
刷题笔记 | 阿里机试+一面+二面
希尔排序DOS攻击一面测评1.给定一个字符串,请找出不含重复字符的最长子串。示例 1:输入: "abcabcbb"输出: "abc"解释: 无重复字符的最长子串是 "abc"示例 2:输入: "bbbbb"输出: "b"解释: 无重复字符的最长子串是 “b”示例 3:输入: "pwwkew"输出: "wke"解释: 无重复字符的最长子串是 wke...原创 2020-04-22 17:14:47 · 1614 阅读 · 0 评论 -
学习笔记 | 最大正方形
221. 最大正方形在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。示例:输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4class Solution(object): def maximalSquare(self, matrix): """ :type m...原创 2020-04-21 22:36:10 · 185 阅读 · 0 评论 -
学习笔记 | 树的最近公共祖先
01 二叉搜索树的最近公共祖先给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]示例 1:...原创 2020-04-21 21:46:34 · 306 阅读 · 0 评论 -
学习笔记 | 华为机试
面试题1.判断两个IP是否属于同一子网给定两个ip地址和一个子网掩码,让每一个ip的二进制位与掩码的二进制位做与运算,如果的得到的结果相同,则笔试两个ip属于同一个子网,此时输出1和第一个ip与掩码与后的结果,否则输出0和第一个ip与掩码与后的结果。例如:ip 1 地址:192.168.0.1ip 2 地址:192.168.0.254子网掩码:255.255.255.0转化为二进制为...原创 2020-04-21 20:34:38 · 1555 阅读 · 0 评论 -
学习笔记 | 美团后台笔试+一面+二面
0102原创 2020-04-16 21:07:23 · 856 阅读 · 2 评论 -
学习笔记 | N叉树的深度
方法一 递归算法int maxDepth(Node* root) { if (!root) return 0; int m = 0; for (Node* it : root->children) m = max(m, maxDepth(it)); return ++m;}方法二 DFS迭代int maxDepth(Node* ro...原创 2020-04-15 15:24:26 · 268 阅读 · 0 评论 -
学习笔记 | 01背包问题
原创 2020-04-14 20:04:26 · 136 阅读 · 0 评论 -
面试笔记 | 腾讯测试开发一面之凉凉
其他了解http?原创 2020-04-09 18:01:14 · 561 阅读 · 0 评论 -
学习笔记 | 只用2GB内存在20亿个整数中找到出现次数最多的数
【题目】有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数。【要求】内存限制为2GB。【难度】士 ★☆☆☆【解答】想要在很多整数中找到出现次数最多的数,通常的做法是使用哈希表对出现的每一个数做词频统计,哈希表的 key 是某一个整数,value 是这个数出现的次数。就本题来说,一共有 20亿个数,哪怕只是一个数出现了20亿次,用32位的整数也可以表示其出现的次数...原创 2020-04-08 13:27:04 · 369 阅读 · 0 评论 -
学习笔记 | 大数据和空间限制 | 布隆过滤器 BloomFilter
初识布隆过滤器【题目】不安全网页的黑名单包含100亿个黑名单网页,每个网页的URL最多占用64B。现在想要实现一个网页过滤系统,利用该系统可以根据网页的URL判断该网页是否在黑名单上,请设计该系统。【要求】该系统允许有万分之一以下的判断失误率。使用的额外空间不要超过30GB。首先介绍哈希函数(散列函数)的概念。哈希函数的输入域可以是非常大的范围,比如,任意一个字符串,但是输出域...原创 2020-04-08 11:10:35 · 256 阅读 · 0 评论 -
面试笔记 | OPPO C++后台开发
1. 自我介绍2. 解释面向对象:继承 多态3. 虚函数,纯虚函数4. 构造方法分为哪几类5. 好像是,拷贝构造函数和重载的区别?6. 指针和引用的区别?7. 有没有什么职业规划?...原创 2020-03-28 16:30:24 · 705 阅读 · 0 评论 -
面试笔记 | 腾讯C++后台开发一面、二面
C++new和malloc的区别堆区和栈区操作系统在缓存里怎么剔除掉经常不用的数据在大量随机的数据里怎么找到某个值进程之间的消息传输线程之间的消息传输...原创 2020-03-26 21:49:59 · 560 阅读 · 0 评论 -
Python | 快速排序、归并排序
快速排序class Solution(object): def Sort(self, arr, start, end): if start < end: i = start j = end tmp = arr[start] while i < j: ...原创 2020-03-26 18:29:08 · 124 阅读 · 0 评论 -
学习笔记 | 回溯算法、分支界定法
回溯算法回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 “回溯” 返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为 “回溯点”。回溯算法的基本思想是:从一条路...原创 2020-03-26 15:16:01 · 264 阅读 · 0 评论 -
学习笔记 | 七种查找方法
七种查找1、顺序查找2、二分查找3、插值查找4、斐波那契查找5、树表查找6、分块查找7、哈希查找原创 2020-03-26 12:40:36 · 340 阅读 · 0 评论 -
刷题笔记 | 位运算
位运算01 ¬ 取反(NOT) 02 ∩ 按位或(OR) 03 ⊕ 按位异或(XOR)两个相同的数字:a^a=0 04 ∪ 按位与(AND)x&1 最低位二进制数,可以用来判断奇偶05 移位移位是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。移位又分为算术移位逻辑移位一个数字除以...原创 2020-03-22 16:57:20 · 171 阅读 · 0 评论 -
python | 二叉树的代码:层次遍历、最大深度、路径总和、相同的树
102. 二叉树的层次遍历给定一个二叉树,返回其按层次遍历的节点值。(即逐层地,从左到右访问所有节点)。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]代码# Definition for a bina...原创 2020-03-21 21:56:11 · 285 阅读 · 0 评论