自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 第三十天:

输入集合中有重复元素,为了避免结果出现重复组合,用 used[] 数组或者 set 集合,这里并没有对结果的顺序有要求,所以可以先排序后去重。

2025-02-14 17:49:03 160

原创 第二十九天:组合+分割

允许选择重复的元素,那么需要修改 startindex,startIndex 的作用是防止出现重复的组合,每次遍历,都需要 startIndex 来记录下一层递归,搜索的起始位置。,我们保证了每一层递归都从上次递归中选择的元素后开始,避免了同一数字在不同递归层中被多次选取,保证了组合中数字的顺序,避免重复的组合。2. 它通过控制每一层递归的起始位置,使得每个数字只能从当前位置及其后续的数字中选择,避免了不同的排列形式产生重复的组合。,我们可能会选择当前层递归中的前一个元素,这样会导致重复的元素出现。

2025-02-14 17:10:04 829

原创 第二十八天:回溯

剪枝(Pruning)是一种。

2025-02-12 18:21:30 1124

原创 第十七天:迭代,递归

迭代方法:把 root1 作为最终的结果,通过比较 root1 和 root2 来修改 root1,最后得到结果。那么有关于二叉搜索树节点值的问题都不需要回溯(最大值/最小值/具体值等),因为由于二叉搜索树节点的有序性,在进行递归搜索时,我们可以根据值的比较直接决定搜索方向。二叉搜索树区别与二叉树的一个特点是二叉树是有序的,任何一个节点的左子树必定小于该节点,右子树必定大于该节点。操作两个二叉树遇到过一次,但是递归的做法是头一次接触,我把迭代的方法套到递归上去了,搞错了。

2025-02-08 16:49:29 246

原创 第十六天:回溯,

递归就比较麻烦,深度最大这个需要两个变量去判断,一个节点当前深度,一个树的最大深度,一旦满足就改变最大深度,而最左边的节点通过前中后序遍历都可以找到,因为左节点遍历始终在右节点之前,加上深度的判断条件,第一个记录的一定是目标值。深度最大首先想到使用BFS层序遍历来解决,而最左边的节点正好就是每一次层序遍历的时候队列第一个节点,这样只需要在之前层序遍历的基础上添加一个判断是否是队列第一个节点的操作。需要中止递归(找到结果即可停止) → 需要返回值。不需要中止递归 → 不需要返回值。不影响 → 不需要返回值。

2025-02-07 15:11:21 188

原创 第十五天 递归,回溯,二叉树

当问题的解空间是通过逐步构建的(如路径搜索、排列生成等),并且在某一步的选择会影响后续的选择时,递归需要配合回溯来撤销无效的选择,以便尝试其他可能性。1. 参数尽量是值传递,而不是引用传递,这样会污染递归的变量状态,只有需要存储最终结果的可以用引用传递。递归必须配合回溯的情况通常出现在需要穷举所有可能的解,并且在探索过程中需要撤销选择(即回退)的问题中。根据结果去倒退遍历的顺序,因为是获取路径,那么首先需要记录当前节点,那就是中在前,即前序遍历。3. 状态回退,需要撤销无效选择,尝试其他可能性(回溯)

2025-01-23 23:46:50 410

原创 第十四天:二叉树的结构操作和深度

3. 单层递归逻辑:针对最简单,最基本的二叉树结构研究,就是一个父节点配合一个左节点和右节点,显然需要分别求出左右节点的深度,取最大值,然后返回父节点加最大值就是最深深度。1. 确定递归函数的参数以及返回值,因为不需要记录节点的值,也不需要多个指针等,所以只传root,返回值是int类型。2. 终止条件:当节点指针为NULL时,就退出遍历,并且因为是空节点,不会计入树的深度,所以返回0。3. 确定单层递归的逻辑,也就是最简单最基本的情况,即一个父节点分别有一个左子树和右子树的情况。再重复递归的三个步骤。

2025-01-21 20:18:18 274

原创 第十三天:遍历二叉树:递归和迭代

递归函数组成递归终止条件:递归需要一个明确的终止条件,当满足该条件时,递归会停止,不再进行进一步的递归调用。没有终止条件的递归会导致栈溢出,即无限循环调用递归步骤:递归调用的核心是将原问题转化为一个更小规模的子问题。通过不断将问题分解,最终问题会简化到基准条件,然后开始逐步返回递归算法的三个要素。每次写递归,都按照这三要素来写确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

2025-01-20 21:20:34 313

原创 第十一天:栈和队列

如果队列后面的元素比要 push 进入的元素小,那就把小的那个 pop 出来,直到这个需要 push 的元素,按照从大到小的顺序在它该在的位置,这样就能确保我们每次滑动窗口变化之后,都可以从这个单调队列的队首取到这个滑动窗口区间的最大值。把表达式的内容push到栈里,如果遇到运算符号,pop出来两个元素,进行运算,得到的结果再push到栈里,直到遍历完,最后栈中只剩一个元素,就是结果。以特定的规律去收集元素的好处在于可以去掉冗余的,不符合我们题目要求的元素,可以避免多余的判断。

2025-01-20 10:42:19 303

原创 第十天:栈和队列

队列是先进先出,有两个开口,栈只有一个开口,但是队列是没有pop_front()这个函数的,deque才有,所以这里需要两个队列,一个队列用来存储stack数据,一个队列用来辅助删除数据。这里通过让字符串的所有字符依次入栈,同时检查入栈字符是不是跟栈顶字符相同,相同就弹出,不同就入栈,最后得到一个没有相邻重复项的字符串,然后把栈中的字符转移到字符串里。用两个栈模拟实现队列即可,一个进一个出,看特点,queue是先进先出,有两个开口;这里我使用了两种方式,一个是初始化一个对应大小的字符串,从后往前填充;

2025-01-17 16:23:20 198

原创 第九天:双指针,KMP

这里 to be or 和 to be 有重复的部分,那么当匹配到 to be A 中的 A 的时候发现匹配不上,那就可以试试用前面的 to be or 去匹配,因为虽然 A 匹配不上,但是 or 是有可能匹配上的。因为是数组的结构改变,所以也可以用双指针,先按照类似 删除倒数第 N 个元素 那道题的方法,用一个快指针去找到 n 后面的部分,然后创建一个新的数组,分别把对应的内容填充到新的数组里面。反转单词,首先反转整个字符串,这样单词的位置就改变过来了,再去按照空格逐个反转单词的字符顺序。

2025-01-16 22:41:30 186

原创 第八天:字符串

接着是翻转字符的两个种情况:剩余字符小于k个和剩余字符小于2k个,区别在于翻转字符的边界不同,一个是 [i, s.size()-1] ,另一个是[i, i+k]因为从前面开始处理的话,需要把未处理的元素往后移动,避免被覆盖,而从后往前就不需要考虑这个问题。这道题也是用双指针,但是k可以是2,3,4.....,那么就不能直接使用swap()了,要包装一下。字符串也可以像顺序存储的线性表那样通过下标访问任意位置的字符,所以这题用双指针的方法来解决,因为出现关于线性表的结构改变以及原地修改输入数组。

2025-01-15 22:34:52 200

原创 第四天:虚拟头节点,双指针解决链表问题

卡哥说的数值相同,不代表指针相同。从题目的意思来看,两个链表如果有相交那一定是在尾部,那么移动更长的那个链表头指针,让两个链表尾部对齐,然后进行遍历,如果有相交就返回对应的指针。关于链表的循环操作,需要先判断当前 cur 指针是否为空,很容易漏掉这里。第一个是判断链表是否有环,基于链表的结构的操作,首先考虑能不能使用双指针,这里使用快慢指针,慢指针走一步,快指针走两步,如果相遇就说明有环。一般涉及到链表节点的增加,删除,改动的操作,用虚拟头结点都会方便很多, 如果只能查的话,用不用虚拟头结点都差不多。

2025-01-11 15:01:21 180

原创 第三天:链表基础

链表是链式存储的线性表,链表的定义一定要熟练掌握,笔试遇到很可能需要自己写链表与数组一个区别是:数组不能直接删除元素,只能覆盖,而链表是能够直接删除元素的。

2025-01-10 22:36:55 241

原创 第二天:滑动窗口,不变量,前缀和复习

我认为是双指针的一种变形,类似昨天的27题,都是快慢指针同向移动,达纳斯指针移动的条件变了。而滑动窗口,两个指针相互配合筛选符合长度的数组,快指针找到大于 target 的数组位置,而慢指针在这个基础上去找符合最小长度的数组。1. 二维数组的使用,虽然在C++中二维数组的内存的地址是连续的,但是我们访问二维数组是用ver[i][j],这样就能够按照一定方向去填充元素。螺旋矩阵这道题的不变量就是按照“左闭右开”的顺序去实现一圈排序,把最外层的排序完之后,开启下一次的排序循环。用for循环实现好一点。

2025-01-09 23:33:50 158

原创 第一天:数组,二分查找,双指针法复习

数组的基本性质就不用重复了,顺序存储的线性表的性质二维数组秋招的时候有一个面试题问了二维数组的访问效率,结合了二维数组的内存空间地址和缓存局部。在C++中二维数组是连续分布的,按行优先访问二维数组的元素的方式效率是最高的,因为元素都在同一个缓存块中,能提高缓存命中率。如果按列优先的方式访问,每次访问的元素都是。无法有效利用缓存的,导致每次访问可能都需要从内存中重新读取数据,而不是从缓存中获取。

2025-01-08 21:25:30 283

原创 SPI协议相关问题

对于低功耗设备和长距离通信,较低的速率可能更适合,而对于高速数据传输和短距离连接,则需要更高的速率。协议层:根据 CPOL 和 CPHA 的不同有四种时序,一般常用的是模式0和模式3,即CPOL 和 CPHA 全为0和全为1的情况。1. 消耗资源,首先需要占用主机较多的口线,每次数据传输都不一定能够全用到。SS:从设备片选线。由主设备控制,用于选择要进行通信的从设备。物理层:SPI通过3条总线和片选线实现主机与被选中的从设备之间的全双工传输。SPI协议是摩托罗拉提出的一种同步串行,高速全双工的通信总线。

2024-03-25 19:14:21 618 1

原创 UART相关问题

为了同步双方传输数据,让发送方先发一位 0 作为数据发送的标志,接收方总线空闲时为高电平,当检测到低电平就知道可能有数据发过来,检测起始位并开始接受数据。数据位可变的原因是UART是一种低速总线,每多发一位都占用不少的时间,所以可以根据传输数据的特点,采用不同位数据的波特率以节省时间。当传输的是ASCII值时最好为8位,因为一个ASCII字符值为8位,如果一帧的数据位为7,那么还有一位就是不确定的值,这样就会出错。异步通信,全双工,低位先行,需要固定的波特率,结构简单,只需要两根通信线。

2024-03-25 13:42:07 474

原创 IIC协议相关问题

在发送寻找从机地址的时候,就必须指定是读还是写。总线都是开漏输出模式,开漏模式输出高电平相当于引脚断开,没有驱动能力,这时被上拉电阻上拉为高电平,实现线与逻辑。I2C地址位一共8位,去除广播地址不用,可用的地址为128,然后这些地址中0x00不用,所以理论上可挂载127个设备。,联系I2C总线连接的多个从机,当主机与从机通信时,其他从机输出高电平并不会影响总线的电平,就不会影响通信。指的是多个信号线直接连接在一起,当所有信号全部为高电平时,总线为高电平,如果有一个信号为低电平,则总线为低电平。

2024-03-01 09:34:31 1374

原创 GPIO_Mode中英文速记

GPIO_Mode_Out_PP(Push-pull) 推挽输出 推挽----推拉。GPIO_Mode_IN_FLOATING 浮空输入。GPIO_Mode_Out_OD(Open-drain) 开漏输出。GPIO_Mode_IPD(IN-Pull-Down) 下拉输入。GPIO_Mode_IPU(IN-Pull-Up) 上拉输入。GPIO_Mode_AF_OD 复用开漏输出。GPIO_Mode_AF_PP 复用推挽输出。GPIO_Mode_AIN 模拟输入。

2024-02-29 10:04:40 702

空空如也

空空如也

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

TA关注的人

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