- 博客(98)
- 收藏
- 关注
原创 记录LC:两数相加
给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0开头。class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { //定义一个新联表伪指针,用来指向头指针,返回结果 ListNod...
2022-03-06 15:13:08 417
原创 连续01的字符串:——LC696
题目:给定一个 0-1 字符串,求有多少非空子字符串的 0 和 1 数量相同。思路:从左往右遍历数组,记录和当前位置数字相同且连续的长度,以及其之前连续的不同数字的长度。举例来说,对于 00110 的最后一位,我们记录的相同数字长度是 1,因为只有一个连续 0;我们记录的不同数字长度是 2,因为在 0 之前有两个连续的 1。若不同数字的连续长度大于等于当前数字的连续长度,则说明存在一个且只存在一个以当前数字结尾的满足条件的子字符串。class Solution { publi
2021-09-01 21:05:24 333
原创 判断回文字符串:——LC647(多看)
题目:给定一个字符,求其有多少个回文子字符串。回文的定义是左右对称。思路:可以从字符串的每个位置开始,向左向右延长,判断存在多少以当前位置为中轴的回文子字符串。class Solution { public int countSubstrings(String s) {int n = s.length(),ans = 0;for (int i = 0; i<2*n-1; ++i){ int l = i / 2, r = i / 2 + i % 2; wh
2021-09-01 20:54:54 156
原创 字符串是否同构:——LC205
题目:判断两个字符串是否同构。同构的定义是,可以通过把一个字符串的某些相同的字符转换成另一些相同的字符,使得两个字符串相同,且两种不同的字符不能够被转换成同一种字符。思路:1.大概思路将问题转化一下:记录两个字符串每个位置的字符第一次出现的位置,如果两个字符串中相同位置的字符与它们第一次出现的位置一样,那么这两个字符串同构。举例来说,对于“paper”和“title”,假设我们现在遍历到第三个字符“p”和“t”,发现它们第一次出现的位置都在第一个字符,则说明目前位置满足同构。2.具体思
2021-09-01 20:47:00 384
原创 字符串比较:——LC242
题目:判断两个字符串包含的字符是否完全相同。思路:class Solution { public boolean isAnagram(String s, String t) { if (s.length() != t.length() ){ return false; } Map<Character,Integer> table = new HashMap<Character, Integer>(); for (int i
2021-09-01 20:31:47 88
原创 前缀和与积分图:和为k的子数组——03
题目:给定一个数组,寻找和为 k 的连续区间个数。输入一个一维整数数组和一个整数值 k;输出一个整数,表示满足条件的连续区间个数。思路:使用一个哈希表 hashmap,其键是前缀和,而值是该前缀和出现的次数。在我们遍历到位置 i 时,假设当前的前缀和是 psum,那么 hashmap[psum-k]即为以当前位置结尾、满足条件的区间个数。class Solution { public int subarraySum(int[] nums, int k) { int c
2021-08-22 21:23:44 94
原创 前缀和与积分图:二维区域和检索——02
1.题目:1.设计一个数据结构,使得其能够快速查询给定矩阵中,任意两个位置包围的长方形中所有数字的和。2.中 sumRegion 函数的四个输入分别是第一个点的横、纵坐标,和第二个点的横、纵坐标。2.思路:类似于前缀和,可以把这种思想拓展到二维,即积分图(image integral)。我们可以先建立一个 intergral 矩阵,intergral[i][j] 表示以位置 (0, 0) 为左上角、位置 (i, j) 为右下角的长方形中所有数字的和。我们可以用动态规划来计算 inte
2021-08-22 21:11:07 181
原创 前缀和与积分图:区域和搜索——01
1.相关概念:一维的前缀和,二维的积分图,都是把每个位置之前的一维线段或二维矩形预先存储,方便加速计算。如果需要对前缀和或积分图的值做寻址,则要存在哈希表里;如果要对每个位置记录前缀和或积分图的值,则可以储存到一维或二维数组里,也常常伴随着动态规划。2.题目:设计一个数据结构,使得其能够快速查询给定数组中,任意两个位置间所有数字的和。3.思路:C++版本对于一维的数组,我们可以使用前缀和来解决此类问题。先建立一个与数组 nums 长度相同的新数组 psum,表示 nums 每
2021-08-22 20:50:20 203
原创 多重集合和映射:重新安排行程(欧拉图—重点学习)
题目:给定一个人坐过的一些飞机的起止机场,已知这个人从 JFK 起飞,那么这个人是按什么顺序飞的;如果存在多种可能性,返回字母序最小的那种。思路及其欧拉图:思路1:先用哈希表记录起止机场,其中键是起始机场,值是一个多重集合,表示对应的终止机场。因为一个人可能坐过重复的线路,所以我们需要使用多重集合储存重复值。储存完成之后,我们可以利用栈来恢复从终点到起点飞行的顺序,再将结果逆序得到从起点到终点的顺序。化简本题题意:给定一个 n 个点 m 条边的图,要求从指定的顶点出发,经过所有的边恰好
2021-08-19 21:57:03 175
原创 哈希表:直线上最多的点——03(hard)
题目:给定一些二维坐标中的点,求同一条线上最多由多少点。思路:对于每个点,我们对其它点建立哈希表,统计同一斜率的点一共有多少个。这里利用的原理是,一条线可以由一个点和斜率而唯一确定。另外也要考虑斜率不存在和重复坐标的情况。本题也利用了一个小技巧:在遍历每个点时,对于数组中位置 i 的点,我们只需要考虑 i 之后的点即可,因为 i 之前的点已经考虑过 i 了。四个小优化:1.在点的总数量小于等于 2 的情况下,我们总可以用一条直线将所有点串联,此时我们直接返回点的总数量即可;2.当
2021-08-19 21:30:03 211
原创 哈希表:最长连续序列——02
题目:给定一个整数数组,求这个数组中的数字可以组成的最长连续序列有多长。思路:可以把所有数字放到一个哈希表,然后不断地从哈希表中任意取一个值,并删除掉其之前之后的所有连续数字,然后更新目前的最长连续序列长度。重复这一过程,我们就可以找到所有的连续数字序列。class Solution { public int longestConsecutive(int[] nums) { Set<Integer> num_set = new HashSet<Inte
2021-08-19 21:05:54 129
原创 哈希表:两数之和——01
哈希表,又称散列表,使用 O(n) 空间复杂度存储数据,通过哈希函数映射位置,从而实现近似 O(1) 时间复杂度的插入、查找、删除等操作。 C++ 中的哈希集合为 unordered_set,可以查找元素是否在集合中。如果需要同时存储键和值,则需要用 unordered_map,可以用来统计频率,记录内容等等。如果元素有穷,并且范围不大,那么可以用一个固定大小的数组来存储或统计元素。例如我们需要统计一个字符串中所有字母的出现次数,则可以用一个长度为 26 的数组来进行统计,其哈希...
2021-08-19 20:42:23 199
原创 双端队列:滑动窗口最大值——01
题目:输入是一个一维整数数组,和一个表示滑动窗口大小的整数;输出是一个一维整数数组,表示每个时刻时的窗口内最大值。思路: 1.利用双端队列进行操作:每当向右移动时,把窗口左端的值从队列左端剔除,把队列右边小于窗口右端的值全部剔除。这样双端队列的最左端永远是当前窗口内的最大值。另外,这道题也是单调栈的一种延申:该双端队列利用从左到右递减来维持大小关系。 2.遍历数组,将 数 存放在双向队列中,并用 L,R 来标记窗口的左边界和右边界。队列中保存的并不是真的 数,而...
2021-08-19 20:32:31 307
原创 优先队列:天际线问题——02(重点学习)
题目:给定建筑物的起止位置和高度,返回建筑物轮廓(天际线)的拐点。输入是一个二维整数数组,表示每个建筑物的 [左端, 右端, 高度];输出是一个二维整数数组,表示每个拐点的横纵坐标。思路:优先队列来优化寻找最大高度的时间,在我们从左到右枚举横坐标的过程中,实时地更新该优先队列即可。这样无论何时,优先队列的队首元素即为最大高度。为了维护优先队列,我们需要使用「延迟删除」的技巧,即我们无需每次横坐标改变就立刻将优先队列中所有不符合条件的元素都删除,而只需要保证优先队列的队首元素「包含该横坐标」
2021-08-17 21:51:08 270
原创 优先队列:合并k和升序链表——01(重点学习)
优先队列介绍:优先队列(priority queue)可以在 O(1) 时间内获得最大值,并且可以在 O(log n) 时间内取出最大值或插入任意值。优先队列常常用堆(heap)来实现。堆是一个完全二叉树,其每个节点的值总是大于等于子节点的值。实际实现堆时,我们通常用一个数组而不是用指针建立一个树。这是因为堆是完全二叉树,所以用数组表示时,位置 i 的节点的父节点位置一定为 i/2,而它的两个子节点的位置又一定分别为 2i 和 2i+1。以下是堆的实现方法,其中最核心的两个操作是上浮和下沉:如
2021-08-17 21:33:17 143
原创 单调栈:每日温度——01
题目:给定每天的温度,求对于每一天需要等几天才可以等到更暖和的一天。如果该天之后不存在更暖和的天气,则记为 0。思路:我们可以维持一个单调递减的栈,表示每天的温度;为了方便计算天数差,我们这里存放位置(即日期)而非温度本身。我们从左向右遍历温度数组,对于每个日期 p,如果 p 的温度比栈顶存储位置 q 的温度高,则我们取出 q,并记录 q 需要等待的天数为 p − q;我们重复这一过程,直到 p 的温度小于等于栈顶存储位置的温度(或空栈)时,我们将 p 插入栈顶,然后考虑下一天。在这个
2021-08-17 21:02:08 125
原创 栈与队列:匹配括号字符串——03
题目:给定一个只由左右原括号、花括号和方括号组成的字符串,求这个字符串是否合法。合法的定义是每一个类型的左括号都有一个右括号一一对应,且括号内的字符串也满足此要求。思路:括号匹配是典型的使用栈来解决的问题。我们从左往右遍历,每当遇到左括号便放入栈内,遇到右括号则判断其和栈顶的括号是否是统一类型,是则从栈内取出左括号,否则说明字符串不合法。结合代码理清思路:class Solution { public boolean isValid(String s) {
2021-08-16 22:05:22 311
原创 栈与队列:查询栈内最小值——02
题目:设计一个最小栈,除了需要支持常规栈的操作外,还需要支持在 O(1) 时间内查询栈内最小值的功能。思路: 1.我们可以额外建立一个新栈,栈顶表示原栈里所有值的最小值。每当在原栈里插入一个数字时,若该数字小于等于新栈栈顶,则表示这个数字在原栈里是最小值,我们将其同时插入新栈内。每当从原栈里取出一个数字时,若该数字等于新栈栈顶,则表示这个数是原栈里的最小值之一,我们同时取出新栈栈顶的值。 2.一个写起来更简单但是时间复杂度略高的方法是,我们每次插入原栈...
2021-08-16 21:51:20 216
原创 栈与队列:双栈实现队列——01
题目:尝试使用栈(stack)来实现队列(queue)。思路: 我们可以用两个栈来实现一个队列:因为我们需要得到先入先出的结果,所以必定要通过一个额外栈翻转一次数组。这个翻转过程既可以在插入时完成,也可以在取值时完成。 队列是一种 先进先出(first in - first out, FIFO)的数据结构,队列中的元素都从后端(rear)入队(push),从前端(front)出队(pop)。实现队列最直观的方法是用链表,但在这篇文章里我会介绍另一个方法 - 使用栈。...
2021-08-16 21:35:04 120
原创 数组:最多能完成排序的块——04
题目:给定一个含有 0 到 n 整数的数组,每个整数只出现一次,求这个数组最多可以分割成多少个子数组,使得对每个子数组进行增序排序后,原数组也是增序的。思路:从左往右遍历,同时记录当前的最大值,每当当前最大值等于数组位置时,我们可以多一次分割。为什么可以通过这个算法解决问题呢?如果当前最大值大于数组位置,则说明右边一定有小于数组位置的数字,需要把它也加入待排序的子数组;又因为数组只包含不重复的 0 到 n,所以当前最大值一定不会小于数组位置。所以每当当前最大值等于数组位置时,假设为 p
2021-08-16 21:18:32 94
原创 数组:快速搜索——03
题目:给定一个二维矩阵,已知每行和每列都是增序的,尝试设计一个快速搜索一个数字是否在矩阵中存在的算法。简单的技巧:我们可以从右上角开始查找,若当前值大于待搜索值,我们向左移动一位;若当前值小于待搜索值,我们向下移动一位。如果最终移动到左下角时仍不等于待搜索值,则说明待搜索值不存在于矩阵中。注意补充:这里是对“方法四”的“如何选出发点”的补充: 选左上角,往右走和往下走都增大,不能选 选右下角,往上走和往左走都减小,不能选 选左下角,往右走增大,往上走减小,
2021-08-16 21:08:25 155
原创 数组:原地旋转数组——02
题目:给定一个 n × n 的矩阵,求它顺时针旋转 90 度的结果,且必须在原矩阵上修改(in-place)。怎样能够尽量不创建额外储存空间呢?思路:利用一个中间数teclass Solution { public void rotate(int[][] matrix) { int n = matrix.length; for (int i = 0; i < n/2; ++i){ for (int j = 0;j<(n+1)/2;
2021-08-16 21:01:17 166
原创 数组:记录数组未出现的数——01
题目:给定一个长度为 n 的数组,其中包含范围为 1 到 n 的整数,有些整数重复了多次,有些整数没有出现,求 1 到 n 中没有出现过的整数。思路:我们可以用一个哈希表记录数组 nums 中的数字,由于数字范围均在[1,n] 中,记录数字后我们再利用哈希表检查 [1,n] 中的每一个数是否出现,从而找到缺失的数字。由于数字范围均在 [1,n] 中,我们也可以用一个长度为 n 的数组来代替哈希表。这一做法的空间复杂度是 O(n) 的。我们的目标是优化空间复杂度到 O(1)。注意到nums
2021-08-16 20:46:07 275
原创 学习总结:C++中STL的数据结构
1.STL介绍STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。2.C++STL提供的数据结构1. Sequence Containers:维持顺序的容器。
2021-08-16 20:22:23 3334
原创 给定一个整数,判断它是否是 4 的次方。
思路解析:首先我们考虑一个数字是不是 2 的(整数)次方:如果一个数字 n 是 2 的整数次方,那么它的二进制一定是 0...010...0 这样的形式;考虑到 n − 1 的二进制是 0...001...1,这两个数求按位与的结果一定是 0。因此如果 n & (n - 1) 为 0,那么这个数是 2 的次方。如果这个数也是 4 的次方,那二进制表示中 1 的位置必须为奇数位。我们可以把 n 和二进制的 10101...101(即十进制下的 1431655765)做按位与,如果结果不为
2021-08-13 20:15:10 363
原创 记录总结SSM和SSH区别
这两个框架都是当下流行的企业级开发的MVC开源框架(一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。框架之所以流行,在于其易复用和简化开发,精髓在思想,掌握了核心思想,我们掌握其他类似框架也不会有问题,建议读一下框架源码,尤其是Spring。)SSH和SSM定义:ssh通常使用 Struts2为控制器(controller) ,spring 为事务层(service), hibernate
2021-08-13 14:49:27 116
原创 记录—创建SpringBoot工程—易错点:
1.记得去启动类开启mapper扫描(@MapperScan)2.接口工程的实例序列化(implementsSerializable)3.因为逆向工程生成的mapper.xml在java文件里,所以需要在pom.xml去配置路径4.多环境配置:spring.profiles.active=dev(1)生存环境不同,经常改绝对路径,所以就写相对路径(用thymeleaf)5.需要将接口工程和父工程打包到本地仓库6.把子工程的版本依赖都放到父工程去统一管理(1)没有版本号的就来...
2021-08-12 22:30:08 96
原创 学习总结:链表随机节点——(LC382)
题目:给定一个单向链表,要求设计一个算法,可以随机取得其中的一个数字。输入是一个单向链表,输出是一个数字,表示链表里其中一个节点的值。思路:蓄水池抽样算法最近经常能看到面经中出现在大数据流中的随机抽样问题即:当内存无法加载全部数据时,如何从包含未知大小的数据流中随机选取k个数据,并且要保证每个数据被抽取到的概率相等。当 k = 1 时,即此题的情况也就是说,我们每次只能读一个数据。假设数据流含有N个数,我们知道如果要保证所有的数被抽到的概率相等,那么每个数抽到的概率应该为
2021-08-11 21:39:22 247
原创 学习总结:按权重随机选择——(LC528)(比较重要)
题目:给定一个数组,数组每个位置的值表示该位置的权重,要求按照权重的概率去随机采样。输入是一维正整数数组,表示权重;和一个包含指令字符串的一维数组,表示运行几次随机采样。输出是一维整数数组,表示随机采样的整数在数组中的位置。补充一些实战场景,以加深记忆(面试会加分吗 XD)Spring Cloud Ribbon (客户端负载均衡)策略中的WeightedResponseTimeRule 此题可简述为「按权重,看作多个区间,按区间宽度越大,概率越大」 在 Ribbon 相关架构中,.
2021-08-11 21:16:54 222
原创 学习总结:随机与取样:打乱数组(LC384)
题目:给定一个数组,要求实现两个指令函数。第一个函数“shuffle”可以随机打乱这个数组,第二个函数“reset”可以恢复原来的顺序。思路:Fisher-Yates 洗牌算法可以用一个简单的技巧来降低之前算法的时间复杂度和空间复杂度,那就是让数组中的元素互相交换,这样就可以避免掉每次迭代中用于修改列表的时间了。Fisher-Yates 洗牌算法Fisher-Yates 洗牌算法跟暴力算法很像。在每次迭代中,生成一个范围在当前下标到数组末尾元素下标之间的随机整数。接下来,将当前元素和随..
2021-08-11 20:56:32 161
原创 区别SQL的DDL、DML、DQL、DCL
一、 DDL 语句DDL(Data Definition Language)语句:数据定义语言,主要是进行定义/改变表的结构、数据类型、表之间的链接等操作。常用的语句关键字有 CREATE、DROP、ALTER 等。二、 DML 语句DML(Data Manipulation Language)语句:数据操纵语言,主要是对数据进行增加、删除、修改操作。常用的语句关键字有 INSERT、UPDATE、DELETE 等。三、 DQL 语句DQL(Data Query Language)语..
2021-08-11 15:17:20 702
转载 学习记录NIO和IO区别!
NIO和IO到底有什么区别?有什么关系?首先说一下核心区别:1.NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和读出的。所以在效率上的话,肯定是NIO效率比IO效率会高出很多。2.NIO不在是和IO一样用OutputStream和InputStream 输入流的形式来进行处理数据的,但是又是基于这种流的形式,而是采用了通道和缓冲区的形式来进行处理数据的。3.还有一点就是NIO的通道是可以双向的,但是IO中的流只能是单向的。1.还有就是NIO的缓冲区(其实也就是一个
2021-08-11 12:45:00 177
转载 记录区别Spring、SpringMVC和SpringBoot
概念:1、SpringSpring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制反转(IOC),和面向切面(AOP),简单的说就是一个分层的轻量级开源框架。Spring为简化我们的开发工作,封装了一系列的开箱即用的组件功能模块,包括:Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring Test等2、S
2021-08-11 12:28:12 213
原创 巧解数学问题-05
题目:判断一个数字是否是 3 的次方。题解:找出数字n是否是数字b的幂的一个简单方法是,n%3只要余数为 0,就一直将n除以b。class Solution { public boolean isPowerOfThree(int n) { if(n<1){ return false; } while(n%3==0){ n/=3; } return n==1; }}...
2021-08-10 22:24:00 97
原创 巧解数学问题-04
题目:给定两个由数字组成的字符串,求它们相加的结果。题解思路:因为相加运算是从后往前进行的,所以可以先翻转字符串,再逐位计算。这种类型的题考察的是细节,如进位、位数差等等。结合代码去思考思路最好:class Solution { public String addStrings(String num1, String num2) { StringBuilder res=new StringBuilder(""); int i=num1.length()-1,j=nu
2021-08-10 22:09:51 170
原创 巧解数学问题-03
题目:给定一个非负整数,判断它的阶乘结果的结尾有几个 0。题解:我们可以检查55的幂,而不是每次除以55来计算因子数。这是通过检查i是否可以被55,2525,125125等整除来实现的。class Solution { public int trailingZeroes(int n) {int count=0;for(int i=5;i<=n;i+=5){ int powerOf5=5; while(i%powerOf5==0){ ...
2021-08-10 21:44:24 127
原创 巧解数学问题-02
题目:输入一个整数,输出一个字符串,表示其七进制题解:进制转换类型的题,通常是利用除法和取模(mod)来进行计算,同时也要注意一些细节,如负数和零。如果输出是数字类型而非字符串,则也需要考虑是否会超出整数上下界。class Solution { int[] nums={1,7,49,343,2401,16807,117649,823543,5764801}; public String convertToBase7(int num) { int tmp=0;
2021-08-10 21:26:52 108
原创 巧解数学问题-01
题目:给定一个数字 n,求小于 n 的质数的个数。质数又称素数,指的是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。值得注意的是,每一个数都可以分解成质数的乘积。题解:埃拉托斯特尼筛法(Sieve of Eratosthenes,简称埃氏筛法)是非常常用的,判断一个整数是否是质数的方法。并且它可以在判断一个整数 n 时,同时判断所小于 n 的整数,因此非常适合这道题。其原理也十分易懂:从 1 到 n 遍历,假设当前遍历到 m,则把所有小于 n 的、且是 m 的倍
2021-08-10 21:14:04 388
原创 MySQL常用命令
一.对数据库常用命令1.连接数据库mysql -u用户名 -p密码2.显示已有数据库show databases;3.创建数据库create database sqlname;4.选择数据库use database sqlname;5.显示数据库中的表(先选择数据库)show tables;6.显示当前数据库的版本信息以及连接用户名select version(),user();7.删除数据库(删除时没有提示直接删除)drop database sqlname;二.数据库中对
2021-08-10 16:57:42 313
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人