自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 算法通关村 | 计算质数问题解析

基本的方式是从2开始依次与n取余测试,看看是否出现n%i==0的情况,如果出现了则说明当前的n能被i整除,所以就不是。基于该基础,就可以造题了,例如LeetCode204 给定整数 n ,返回 所有小于非负整数 n 的质数的数量。我们先选中数字2,2是素数,然后将2的倍数全部排除(在数组里将该位置标记为0就行了)。解决这个题有一个有效的方法,叫做埃氏筛,后来又产生了线性筛, 奇数筛等改进的方法。接着我们选中数字3,3是素数,然后将3的倍数全部排除。接着我们选择数字5,5是素数,然后将5的倍数全部排除。

2023-09-01 10:03:35 132

原创 算法通关村 | 幂运算问题解析

求2的幂LeetCode231. 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得 n == 2^x ,则认为 n 是 2 的幂次方。示例1:输入:n = 16输出:true解释:2^4 = 16示例2:输入:n = 3输出:false本题的解决思路还是比较简单的,我们可以用除的方法来逐步缩小n的值,另外一个就是使用位运算。逐步缩小的方法就是如果 n 是 2 的幂,则 n>0,且存在非负整数

2023-09-01 09:49:37 164

原创 算法通关村 | 数字统计问题处理模板

LeetCode1822 给定一个数组,求所有元素的乘积的符号,如果最终答案是负的返回-1,如果最终答案是正的返回1,如果答案是0返回0。仔细分析一下这道题目,如果将所有数都乘起来,再判断正负,工作量真不少,而且还可能溢出。我们发现,一个数如果是 -100 和 -1,对符号位的贡献是完全一样的,所以只需要看有多少个负数,就能够判断最后乘积的符号了。阶乘0的个数很多数学相关算法的关键在于找到怎么通过最简洁的方式来解决问题,而不是硬算。例如:。这个题如果硬算,一定会超时,其实我们可以统计有多少个 0,实

2023-09-01 09:46:41 124

原创 算法通关村 | 字符串压缩问题

当读指针read 位于字符串的末尾,或读指针read 指向的字符不同于下一个字符时,我们就认为读指针read 位于某一段连续相同子串的最右侧。该子串对应的字符即为读指针 read 指向的字符串。我们使用变量 left 记录该子串的最左侧的位置,这样子串长度即为 read−left+1。这里还有一个问题,就是长度可能超过10,因此还要实现将数字转化为字符串写入到原字符串的功能。这里我们采用短除法将子串长度倒序写入原字符串中,然后再将其反转即可。请在 修改完输入数组后 ,返回该数组的新长度。

2023-08-30 16:18:15 136

原创 算法通关村 | 字符串反转问题

对于长度为 N 的待被反转的字符数组,我们可以观察反转前后下标的变化,假设反转前字符数组为 s[0] s[1] s[2] …我们可以记录出现的次数,如果一个字符串经过重新排列后,能够变成另外一个字符串,那么它们的每个不同字符的出现次数是相同的。这里第一眼感觉不是特别复杂,同样从两头向中间即可,但问题是"-"不是均匀的有些划分的段长,有的短,这就增加了处理的难度。给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。一个接一个输出 s 的所有字符。

2023-08-30 16:16:04 50

原创 算法通关村 | 字符串转换整数(atoi)问题

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。本题涉及到数字溢出的处理,我们在下一关讲解数学的时候再详细解释,这里先考验一下,看看自己能否想明白。

2023-08-30 16:06:47 33

原创 算法通关村 | 位运算的妙用

本题的解法还有很多,例如还有一种分块的思想, n 的二进制表示有 32 位,可以将 n 的二进制表示分成较小的块,然后将每个块的二进制位分别颠倒,最后将每个块的结果合并得到最终结果。下面的代码中,每一行分别将 n 分成16 位、8 位、4 位、2 位、1 位的块,即把每个块分成两个较小的块,并将分成的两个较小的块颠倒。由于 Java不存在无符号类型,所有的表示整数的类型都是有符号类型,因此需要区分算术右移和逻辑右移,在Java 中,算术右移的符号是 >>,逻辑右移的符号是 >>>。

2023-08-16 10:53:34 85

原创 算法通关村 | 位运算符常用技巧

处理位操作时,还有很多技巧,不要死记硬背,理解其原理对解决相关问题有很大帮助。下面的示例中,1s和0s分别表示与x等长的一串1和一串0:而如何获取、设置和更新某个位的数据,也有固定的套路。

2023-08-16 10:50:29 40

原创 算法通关村 | 寻找两个正序数组的中位数

这是一道比较难的问题,LeetCode4.给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。小的数,查找范围缩小了一半。同时,我们将在排除后的新数组上继续进行二分查找,并且根据我们排除数的个数,减少 k 的值,这是因为我们排除的数都不大于第 k 小的数。越界,那么我们可以选取对应数组中的最后一个元素。因此,这道题可以转化成寻找两个有序数组中的第。,我们只要返回两个数组首元素的最小值即可。是奇数时,中位数是两个有序数组中的第。是偶数时,中位数是两个有序数组中的第。

2023-08-16 10:26:34 59

原创 算法通关村 | 二分查找与搜索树高频问题

LeetCode852.这个题的要求有点啰嗦,核心意思就是在数组中的某位位置i开始,从0到i是递增的,从i+1 到数组最后是递减的,让你找到这个最高点。详细要求是:符合下列属性的数组 arr 称为山脉数组 :arr.length >= 3存在 i(0 < i < arr.length - 1)使得:给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[arr.length - 1] 的

2023-08-16 10:24:35 61

原创 算法通关村 | 二分查找

第一种,也是最简单的方式,找到相等位置向左使用线性查找,直到找到相应的位置。你觉得可以得到90分,很可惜是0分,因为当你测试的时候,可能会出现死循环,例如原始序列是1到8,搜索3的时候就死循环了,为什么呢?在计算机中,除的效率非常低,一般可以使用移位来代替,也就是。如果这样的话,能得到80分,面试官可能会继续问,还会有什么问题。假如在上面的基础上,元素存在重复,如果重复则找左侧第一个,请问该怎么做呢?后面的条件配合,我们不要给自己添麻烦,在理解的基础上熟记这种方式就行了。也有多种方式的,这需要与。

2023-08-16 10:18:49 25

原创 算法通关村 | 最近公共祖先问题

最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。LeetCode236.给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

2023-08-06 12:31:49 63

原创 算法通关村 | 最大深度问题

说明: 叶子节点是指没有子节点的节点。例如上面的例子返回结果为最大深度为3。首先看一下104题最大深度:给定一个二叉树,找出其最大深度。还可以使用广度优先遍历。

2023-08-06 12:28:34 64

原创 算法通关村 | 二叉树中双指针和路径问题

这个貌似就是两个二叉树同时进行前序遍历,先判断根节点是否相同, 如果相同再分别判断左右子节点是否相同,判断的过程中只要有一个不相同就返回 false,如果全部相同才会返回true。如果两个节点的值相同,则判断两个节点的子节点是否为空,如果只有一个节点的左子节点为空,或者只有一个节点的右子节点为空,则两个二叉树的结构不同,因此两个二叉树一定不同;如果两个节点的子节点的结构相同,则将两个节点的非空子节点分别加入两个队列,子节点加入队列时需要注意顺序,如果左右子节点都不为空,则先加入左子节点,后加入右子节点。

2023-08-06 12:23:16 69

原创 算法通关村 | 迭代法实现前序遍历

前序遍历是中左右,如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。不难写出如下代码: (注意代码中,空节点不入栈)

2023-08-04 15:15:14 65

原创 算法通关村 | 递归实现前中后序遍历

定义递归结束条件:递归程序必须有结束条件,否则将无限递归下去。根据问题的特性,定义一个或多个基本情况,当满足这些条件时,递归终止并返回结果。在这一步中,要将原始问题分解为更小的子问题或相似的子问题。调用递归函数:在函数内部,以递归调用的方式解决子问题。递归问题通常具有可以分解为相同结构的子问题的特点。处理递归返回结果:如果递归函数返回结果,需要根据实际情况处理返回的结果。前序遍历:先打印中间的元素然后操作左边的元素,最后操作右边元素。中序遍历:先操作左边然后打印中间的元素,最后操作右边元素。

2023-08-03 12:00:59 73

原创 算法通关村 | 树的层次遍历

简单,用一个变量size标记一下就行了,size表示某一层的元素个数,只要出队,就将size减1,减到0就说明该层元素访问完了。LeetCode103 题,要求是:给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。LeetCode 515题目要求:给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。如果从左至右,我们每次将被遍历到的元素插入至双端队列的末尾。从右至左,我们每次将被遍历到的元素插入至双端队列的头部。

2023-08-03 10:32:45 79

原创 算法通关村 | 通过中序和后序序列恢复二叉树

中序:3 4 8 6 7 5 2 1 10 9 11 15 13 14 12。看如下中间节点的顺序,就可以发现,访问中间节点的顺序就是所谓的遍历方式。,只要大家记住 前中后序指的就是中间节点的位置就可以了。为根节点的右儿子,通过中序遍历得到。通过后序遍历可以知道倒数第二的。通过后序遍历可以知道最后的。为根节点,通过中序遍历得到。的右儿子,通过中序遍历得到。的右儿子,通过中序遍历得到。的右儿子,通过中序遍历得到。的左子树,根据中序遍历。的左子树,根据中序遍历。通过后序遍历可以知道。通过后序遍历可以知道。

2023-08-03 10:25:04 51

原创 算法通关村 | LRU实现

如果 key 不存在,使用 key 和 value 创建一个新的节点,在双向链表的头部添加该节点,并将 key 和该节点添加进哈希表中。然后判断双向链表的节点数是否超出容量,如果超出容量,则删除双向链表的尾部节点,并删除哈希表中对应的项;通过哈希表定位到该节点在双向链表中的位置,并将其移动到双向链表的头部,最后返回该节点的值。如果 key 存在,则与 get 操作类似,先通过哈希表定位,再将对应的节点的值更新为 value,并将该节点移到双向链表的头部。此时会将2移动到链表的首部,也就是下图d的样子。

2023-07-31 20:54:52 69 1

原创 算法通关村 | 队栈和Hash的经典算法题

每次pop 或 peek 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。其中 queue1用于存储栈内的元素,queue2作为入栈操作的辅助队列。,则 queue1的元素即为栈内的元素,queue 1的前端和后端分别对应栈顶和栈底。,此时 queue2的前端的元素即为新入栈的元素,再将。

2023-07-31 20:42:42 64 1

原创 算法通过村 | 实现队列

队列的特点是节点的排队次序和出队次序按入队时间先后确定,即先入队者先出队,后入队者后出队,即我们常说的FIFO(first in first out)先进先出。

2023-07-31 20:34:57 24 1

原创 算法通关村 | 计算器问题

加号:将数字压入栈;代码实现中,若读到一个运算符,或者遍历到字符串末尾,即认为是遍历到了数字末尾。由于乘除优先于加减计算,因此不妨考虑先进行所有乘除运算,并将这些乘除运算后的整数值放回原表达式的相应位置,则随后整个表达式的值,就等于一系列整数加减后的值。具体来说,遍历字符串 ss,并用变量preSign 记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。基于此,我们可以用一个栈,保存这些(进行乘除运算后的)整数的值。对于乘除号后的数字,可以直接与栈顶元素计算,并替换栈顶元素为计算后的结果。

2023-07-30 11:45:05 44 1

原创 算法通关村 | 最小栈问题

对于栈来说,如果一个元素 a 在入栈时,栈里有其它的元素 b, c, d,那么无论这个栈在之后经历了什么操作,只要 a 在栈中,b, c, d 就一定在栈中,因为在 a 被弹出之前,b, c, d 不会被弹出。因此,在操作过程中的任意一个时刻,只要栈顶的元素是 a,那么我们就可以确定栈里面现在的元素一定是 a, b, c, d。当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。

2023-07-30 11:43:44 28 1

原创 算法通关村 | 如何基于数组实现栈

【代码】算法通关村 | 如何基于数组实现栈。

2023-07-30 11:41:03 85 1

原创 算法通关村第3关 | 数组有关题目

要操作的数组中除了某个数字只出现了一次之外,其他数字都出现了两次,所以可以定义一个变量赋初始值为0,用这个变量与数组中每个数字做异或运算,并将这个变量值更新为那个运算结果,直到数组遍历完毕,最后得到的变量的值就是数组中只出现了一次的数字了。利用Set集合不存重复值的特性,当要添加的元素key与集合中已存在的数重复时,不再进行添加操作,而是将集合中的key一起删掉,这样整个数组遍历完后,集合中就只剩下了那个只出现了一次的数字了。请找出数组中任意一个重复的数字。首先看 [1,2,1,3,1,4,1],

2023-07-29 12:30:35 41

原创 算法通关村第3关 | 双指针的妙用

LeetCode27.给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。LeetCode26 给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。本题使用双指针最方便,思想与上题的一样,一个指针负责数组遍历,一个指向有效数组的最后一个位置。** 删除重复出现的元素,使得出现次数超过两次的元素。

2023-07-28 15:05:29 35 1

原创 算法通关村第3关 | 不简单的数组增删改查

先来看如何合并两个有序数组,LeetCode88:给你两个按非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。例如已有序列为{3,4,7,8},如果插入的元素比8大,例如9,假如index=0,则最后结果是{9,3,4,7,8}。我们判断整体单调性不是白干的,很多时候需要将特定元素插入到有序序列中,并保证插入后的序列仍然有序,例如leetcode35:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。

2023-07-28 15:02:05 82 1

原创 算法通关村第2关 | K个一组反转

LeetCode25.给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

2023-07-26 14:12:50 45 1

原创 算法通关村第2关 | 链表加法问题解析

LeetCode369.用一个非空单链表来表示一个非负整数,然后将这个整数加一。计算是从低位开始的,而链表是从高位开始的,所以要处理就必须反转过来,此时可以使用栈,也可以使用链表反转来实现。基于栈实现的思路不算复杂,先把题目给出的链表遍历放到栈中,然后从栈中弹出栈顶数字 digit,加的时候再考虑一下进位的情况就ok了,加完之后根据是否大于0决定视为下一次要进位。

2023-07-26 14:09:43 154 1

原创 算法通关村第2关 | 终于学会链表反转了

本题有两种方法,带头结点和不带头结点,我们都应该会,因为这两种方式都很重要,如果搞清楚,很多链表的算法题就不用做了。

2023-07-26 12:57:23 85 1

原创 编程导航算法通关村第1关 | 链表中环的问题

给定一个链表,判断链表中是否有环,这就是。进一步,假如有环,那环的位置在哪里?这就是题。

2023-07-23 18:52:59 105

原创 编程导航算法通关村第1关 | 链表高频面试算法题

val = x;} }

2023-07-22 20:55:47 133 1

原创 编程导航算法通关村第1关|链表的基础与构造方法

头结点中数据data可以为null也可以存储数据data保存数据,next指向下一个结点。

2023-07-18 19:12:38 405 1

原创 007:返回什么才好呢

程序填空,使其按要求输出#include <iostream>using namespace std;class A {public: int val; A(int// 在此处补充你的代码};int main(){ int m,n; A a; cout << a.val << endl; while(cin >> m >> n) { a.GetObj() = m; cout << a.v

2021-05-15 18:53:52 257

原创 006:奇怪的类复制

006:奇怪的类复制描述程序填空,使其输出9 22 5#include <iostream>using namespace std;class Sample {public: int v;// 在此处补充你的代码};void PrintAndDouble(Sample o){ cout << o.v; cout << endl;}int main(){ Sample a(5); Sample b = a; PrintA

2021-05-15 14:14:48 531 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除