自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C/C++中类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast

提供安全的基本类型转换:但是要注意数据的截断或者改变。(float转换为整数的时候丢失小数部分)。向上转换(将派生类的指针/引用转换为基类的指针/引用),这是安全的,因为派生类总是包含基类的全部信息。向下转换(将基类的指针/引用转换为派生类的指针/引用),这是不安全的,因为基类不一定包含派生类的全部信息。空指针转换为目标类型的空指针:class Base {};// 安全转换,d 仍然是 nullptr。(b);// 安全转换,d 仍然是 nullptr。

2024-01-04 21:17:51 943

原创 C++面试总结2:strcpy, sprintf, memcpy

描述:该函数从 src 指向的内存地址开始复制 n 个字节到 dest 指向的内存地址。因此它可以用来复制任何类型的数据,包括字符串、数组、结构体等。描述:该函数根据 format 字符串来格式化数据(可以是多种类型,如整数、浮点数、字符串等),并把格式化后的结果复制到 str 指向的字符串中。这里的 format 字符串类似于 printf 函数中使用的格式字符串.注意:src 和 dest 的内存区域不应重叠,如果需要处理重叠内存区域的情况,应使用。功能:用于复制一个字符串到另一个字符串。

2023-12-28 17:03:33 446

原创 day1:编译器、操作系统的一些问题

编译器:是一个软件、主要功能将高级语言编写的源代码转成对应硬件平台的机器码。注意:在使用的时候我们一般用一个完整的编译工具链:编译器、汇编器、链接器。但是由于编译器的功能较为强大,我们会更关注与学习这个。编译器编译器首项将高级语言代码转换成汇编语言。在这个过程中会包含语法分析、语义分析、中间代码生成以及优化等步骤。编译器生成的汇编代码是基于对应硬件平台的。汇编器编译器会调用汇编器(或编译器内置的汇编器功能)将汇编语言代码转化成机器码。这里就相当于一对一的翻译过程了。链接器。

2023-12-01 15:53:57 463

原创 C++面试的一些总结day1:指针和引用的区别

指针:指针是一个变量,其值为指向对象的内存地址,而不是值本身。引用:可以理解为对象的别名,是另外一个变量的直接别名,用于创建一个已存在变量的另一个名字。int a = 10;// 变量 a 存储了值 10// ref 是变量 a 的引用int b = 20;// 变量 b 存储了值 20ref = b;// 这实际上是将 b 的值赋给 a。

2023-11-29 21:52:34 743 1

原创 代码随想录训练营day48|dp:198. 打家劫舍、213.打家劫舍2

【代码】代码随想录训练营day48|dp:198. 打家劫舍、213.打家劫舍2。

2023-06-11 20:31:47 91

原创 代码随想录训练营day46|dp:139.单词拆分

【代码】代码随想录训练营day46|dp:139.单词拆分。

2023-06-11 19:35:54 101

原创 代码随想录训练营day45|dp: 322.零钱兑换、279.完全平方数

【代码】代码随想录训练营day45|dp: 322.零钱兑换、279.完全平方数。

2023-06-02 20:47:13 67

原创 代码随想录训练营day44|dp:518.零钱兑换2、377.组合总和5

【代码】代码随想录训练营day44|dp:518.零钱兑换2、377.组合总和5。

2023-06-01 21:19:48 80

原创 代码随想录训练营day44|dp:1049. 最后一块石头的重量、

难点在于递推公式的理解。

2023-05-31 22:23:28 111 1

原创 代码随想录训练营day42|dp:416.分割等和子集

对于背包问题:01背包、完全背包始终有三个数组是非常重要的。对于dp[i] 的含义, 核心就是背包重量为i,他所能装的物品的最大价值是多少。但是里面就会出现很多的变化。有些是在等等。

2023-05-30 20:00:54 78

原创 代码随想录训练营day41|dp:343.整数拆分、96.不同的二叉搜索树

【代码】代码随想录训练营day41|dp:343.整数拆分、96.不同的二叉搜索树。

2023-05-29 21:23:28 74

原创 代码随想录训练营day39|dp:62.不同路径、63.不同路径2

【代码】代码随想录训练营day39|dp:62.不同路径、63.不同路径2。

2023-05-28 17:04:18 51

原创 代码随想录训练营day38|dp:509斐波那契数、70.爬楼梯、746.最小花费爬楼梯

这一题是可以优化空间的。但是就不太易于理解dp了。

2023-05-26 17:05:27 53

原创 代码随想录训练营day35|860.柠檬水找零

感觉不像贪心,而是像模拟。

2023-05-26 15:50:49 32

原创 代码随想录训练营day34|1005.K次取反后最大化数组的和、134.加油站、135.分发糖果

代码随想录的方法:先排序,然后遍历到k将负数变成正数。

2023-05-24 21:25:26 156

原创 代码随想录训练营day32|122.买卖股票的最佳时机2、55.跳跃游戏

对于贪心问题,不要想着一步或者几步吧最终规律或者求解方式找到。而是关注当前几步的最优解,这才是贪心。在局部找到最优的,在根据题目的逻辑,找到最后的全局最优。但是这个局部最优不一定能够推出全局最右。但是解贪心类问题的时候得这样思考。

2023-05-24 20:03:07 35

原创 代码随想录训练营day31|贪心:455.分发饼干、376.摆动序列、53.最大子数组和

在使用贪心算法解决问题时,以下是一些技巧和注意事项:理解问题的特性:贪心算法适用于一些具有的问题。这意味着在每个步骤中,你都可以做出当前最优的选择,而不需要回溯或者考虑未来的选择。确定贪心策略:贪心算法的关键是选择一个合适的贪心策略。这需要你对问题有深入的理解。贪心策略可以是基于最大值、最小值、最大/最小比率等等。证明贪心选择的正确性:在使用贪心算法时,你需要能够证明每次贪心选择都是最优的,而不会导致最终结果的不正确性。这可以通过数学归纳法、反证法或其他证明方法来完成。

2023-05-21 22:02:38 127

原创 代码随想录训练营day29|回溯:491.递增子序列、46.全排列、47.全排列2

思路:对于终止条件:可以使用temp.size()>=2来判断。但是这里只需要ans.add 即可,不可以return。return会吧大于2的都丢弃。至于去重 的时候使用了辅助的map或者数组来做。是因为这里的nums不是递增的,也不可以变成递增的。只能用map来记录是否使用过。其中比较不好理解的是used[i-1] == false.在上一题的基础上需要对横向层级上的重复元素去重,这里使用了。在for里面的横向遍历的时候,还要判断去重和递增。对于排列问题的剪枝去重,去除重复的排列。

2023-05-17 16:57:37 73

原创 代码随想录训练营day28|回溯:93.复原ip地址、78.子集、90.子集2

因此,终止条件可以没有,只是在index>=length的时候return 里面没有任何操作。思路:子集问题和之前的组合、分割问题的区别在于:收集的是所有节点包括第一个[]空。思路:回溯分割问题的标准模板。就是需要修改单词递归逻辑里面的部分逻辑。而是将ans.add() 放在前面,这样就可以获取所有的节点了。在横向遍历的时候不能使用重复的元素,和组合总和2,很像。和上一题的区别是多了一个去重的逻辑。

2023-05-16 21:17:52 93

原创 代码随想录训练营day27|回溯:39.组合总和、40.组合总和2、131.分割回文串

substring(int beginIndex, int endIndex): 返回从指定的开始索引位置到指定的结束索引位置之间的子字符串。这只是一些常见的String函数示例,Java的String类还提供了许多其他有用的函数,可以根据具体的需求选择适当的函数进行字符串处理。replace(char oldChar, char newChar): 将字符串中的指定字符替换为新的字符。关键点:注意是可以重复的所以,在递归的时候的i不应去加1了。length(): 返回字符串的长度。

2023-05-15 21:08:49 43

原创 代码随想录训练营day25|回溯:216.组合总和3、17.电话号码的字母组合

思路:模板题。区别在于终止条件多了一步,要判断在满足个数为k时,求和是否为n,因此也多了一个变量sumTemp用来累加求和,避免还要对temp链表求和(多使用变量)。

2023-05-13 19:49:28 51

原创 回溯:77.组合

【代码】回溯:77.组合。

2023-05-13 16:42:39 44

原创 代码随想录训练营day23|树:669.修剪二叉树、108.将有序数组转化为二叉搜索树、538.把二叉搜索树转换为累加树

别忘了二叉树的遍历,遍历递归的第一步处理的是终止条件,然后就会依次处理叶子结点,一层层网上走了。由于是二叉搜索树,只要右中左的顺序就可以得到结果了。思路:因为原数组已经有序了,所以可以先找到mid (mid一定就是父节点)。思路:这个题目要实现的就是从最右子节点开始逐步累加,按照右中左的顺序。

2023-05-11 20:44:23 84

原创 代码随想录训练营day21|树:235.二叉搜索树的最近公共祖先、701.二叉搜索树的插入操作、450.删除二叉搜索树中的节点

这里利用的二叉搜索树特性不是中序遍历,而是顺序排列。找到这个公共祖先 还是要后序的方法的。当前root.val == key时 找到要删除的节点时,才可以有下面的讨论。p, q 小于当前root 那么结果一定是在root的左子树。p, q 大于当前root 那么结果一定是在root的右子树。p<root<q 那么第一个找到的root就是最近公共祖先。没必要把这道题目做复杂,只要在叶子节点插入就好。

2023-05-10 21:27:56 74

原创 day20|树:530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

而是比较父节点 左子节点 右子节点 三个数之间的差值。以上的解释有误,其实还是找的全局最小的差值,只不过因为是二叉搜索树,他有前后顺序的。所以最小的差值一定是相邻的,所以两个指针一个pre 一个cur(就是当前root)比较差值即可。使用回溯,找到了p就返回p,找了了q就返回q。思路:结合二叉搜索树的特性,就相当于处理一个数组。关于返回值问题,这里使用了一个全局变量 result来记录结果,就不用再在递归里面加返回值了。一开始想用遍历普通二叉树那样,将结果都放到一个map里面,最后得到出现次数最多的数。

2023-05-09 21:39:59 78

原创 代码随想录训练营Day19树:654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

思路:分别比较root和root.left;root和root.right。利用两个指针记录root的左右两侧,在递归。当出现左中右不递增的时候返回false,否则一直遍历到null返回true。关键点:不用考虑数值和null相加的情况。因为在其中一个为null时,直接返回另一个子树。基于这个性质,我们可以利用二叉搜索树进行快速的查找、插入和删除等操作,时间复杂度通常为 O(log n)。思路:找到最大的座位父节点,左边看作左子树,右边看作右子树。思路:按照中序遍历,将二叉树遍历到数组里。

2023-05-08 21:54:43 56

原创 代码随想录训练营Day18|树:513.找树左下角的值、112.路径总和、113.路径总和2、106.从中序和后序遍历序列构造二叉树、105.从前序和中序遍历序列构造二叉树

思路:利用层序遍历,每次result记录最左侧的节点,到最后一层result就更新为树的左下角。关键点:在数组问题上 会遇见的左闭右开还是左闭右闭的问题,这里用的是左闭右闭。思路:与上题基本一致,只不过返回的结果是具体的路径。以及在递归时候**传入参数))的细节。后序确定父节点,中序确定左右子树。完整的模板代码 便于理解。层序遍历会更加简单一点。

2023-05-06 22:37:48 57

原创 代码随想录训练营Day17|树:110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

思路:这种找到所有子集合的问题,都用可以考虑回溯来做。与递归的区别是在递归处理之后多了一步回退的操作。和上一题完全二叉树很像,递归判断左右子树是否为平衡二叉树。

2023-05-05 21:20:38 71

原创 代码随想录训练营Day15|树:104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

给的是数组,不是说要对数组进行处理,是按照数组的顺序 一步步深层数。就是不用后续遍历了。发现一个问题:在面试的时候手写代码的话,前面的这些数据结构有可能都是要自己去写的。思路:修改求深度的时候左右的最大深度+1–>每次都计数一个。思路:通过递归找到满二叉树,得到满二叉树的个数,再往上求和。思路:三种情况:左子树为空、右子树为空,左右子树都不为空。三种情况:左子树为空、右子树为空,左右子树都不为空。:后序遍历,将左右节点得到的深度返回给父节点。解法一:这个是根据求深度的方法改变的。的最短路径上的节点数量。

2023-05-04 21:14:27 100

原创 代码随想录训练营Day14|树:层序遍历(十道题)、226.翻转二叉树、101.对称二叉树

注意:综上所述,ArrayList和LinkedList都实现了List接口,但是它们的内部实现不同,适用于不同的场景。在需要频繁进行随机访问的情况下,ArrayList的性能更好;在需要频繁进行插入和删除操作的情况下,LinkedList的性能更好。List接口提供了一些基本的操作,可以方便地对集合进行操作。在实际应用中,需要根据具体场景选择合适的集合类。

2023-05-03 16:16:44 61

原创 代码随想录训练营Day13:树|144.前序遍历、145.后序遍历、94.中序遍历。

int val;

2023-05-02 19:39:14 104

原创 代码随想录训练营Day12|347.前k个高频元素、239.滑动窗口最大值

思路:单调队列,保证当前的 队列里的元素是单调递减了。最好的方法是用堆来做,在复习完树之后,回顾本题。这里用的是Hash来做的,复杂度较高。

2023-05-01 19:47:14 36

原创 代码随想录训练营Day11|20.有效的括号、1047.删除字符串中所有相邻的重复项、150.逆波兰表达式求值

因此,只要将遍历到左边对应的就把右边对应的入栈,同时由于栈的特性,他的栈顶元素一定是和最后一次出现的左边对应遍历到后面,就会出现右边的元素,如果遍历到右边的元素,就和栈顶元素比较,相同则出栈,不同则错误。(({{[[]]}}))、(){}[]、({}[]) 这是正确的情况。这种方法是基于字符的ASCII值,因为字符。是C++标准库中的一个函数,用于将字符串转换为整数。表示因为字符串"adbc"无法转换为整数,所以。此处的思路用的是栈,用暴力也可以做。的大小为1),那么你可以使用。函数转换,将会抛出一个。

2023-04-29 12:29:35 73

原创 代码随想录训练营day10|232.用栈实现队列、225.用队列实现栈

思路:用一个栈实现。关键点就是在pop和top操作时,先将queue中最后一个元素(将要出战的元素)之前的所有元素先弹出队列,在从后面入队列。代码随想录中对于out没有在倒回in的操作,而是直接对out操作pop或者peek,只要out中有元素就可一直操作,直到out中没有元素了,就将in中的元素都倒过来。我这里稍微复杂了点,完成了一次pop和push之后都将out里面的元素在倒回in里面。代码随想录的区别是:在push的时候就将其放到首位,那么后面pop和top的时候直接弹出首位就可以了。

2023-04-28 21:01:35 94

原创 代码随想录训练营Day09|28.实现strStr()、459.重复的子字符串

需要了解KMP算法,因为字符串匹配的问题好像还蛮多的,实在不行可以背下来。

2023-04-27 21:23:25 84

原创 代码随想录训练营Day08|344.反转字符串、541.反转字符串2、剑指offer 05.替换空格、151.反转字符串里的单词、剑指offer58:左旋转字符串

现需将路径加密,加密方法为将 path 中的分隔符替换为空格 " ",请返回加密后的字符串。,就可以找到每次交换的起始位置,因为i是从0开始的(如果从i=-1开始就是2k的位置,也就是交换起始位置的前一位)。下面就是判断结束位置,但是结束位置要分情况,就是最有一个2k结束之后剩下的部分。关键点:如何找到一种很好的方式确定这些位置,还有特殊情况的判定比较关键。请实现一个函数,把字符串 s 中的每个空格替换成"%20"。找到交换位置的起始和结束位置,依次交换即可。思路:双指针,首部和尾部交换,方向向内。

2023-04-26 21:49:25 102

原创 代码随想录训练营day7|454.四数相加2、383.赎金信、15.三数之和、18.四数之和

按照代码随想录的解法构建三个指针,i,left, right(可以用不同的方法 left mid right)。**关键点:**将最后结果的组成形式 拆成两部分,先求一半,在求一办。则调到下一个,因为i已经找过了,如果符合条件的话,那么后面的i就不需要了。思路:和三数之和类似,但是多了一层for循环,可以将前两个看成之前的i。**思路:**双指针不难想到,去重环节的细节很多。首先,为了去重,我要将重复的元素放在一起,所以需要先给数组排序。**思路:**这一题和两数之和很相似,就是变成了四个数组。

2023-04-25 22:00:28 92

原创 代码随想录训练营day6|242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

则。

2023-04-24 21:52:17 91

原创 代码随想录训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表2

对齐起始位置:先遍历两个链表,分别得到长度,在将长的链表上移动长度差值个节点使得从两个链表的起始位置到最后一个位置(此时也和第一个相交位置)距离相同。思路:这里拓展一下,不止交换两个,而是交换k个。**关键点:**在使用辅助节点之后要将对应的辅助节点重置到头节点,因为要从头节点重新开始遍历判断。关键点:理清交换的思路,对于组内交换完成之后要及时将pre和cur移动到下一个位置。其实也不能说是双指针因为没有体现双指针的配合,只是用了两个指针在不同的链表。**思路:**双指针+对齐起始位置。

2023-04-22 21:01:45 44

原创 代码随想录训练营第三天|203:移除链表元素、707:设计链表、206:反转链表

虚拟节点::避免讨论头结点为空。与head一样,在后面的步骤中一般不对其操作。我的链表方向是从左到右。:主要是用来遍历:的左边一个节点,是实现任务的主要变量,与配合使用:的右边一个节点思路:这一题还是很简单的。关键点:分清楚几个辅助的节点的功能。LeetCode:707:设计链表几乎是看着代码随想录做完的,后面需要再刷。首先要构造出一个基本的链表节点的数据结构。定义结构:这是一个叫做 的结构体的定义。在C++中,结构体()可以被用来定义一个数据结构,它可以包含多个数据成员。数据成

2023-04-21 23:22:58 44

空空如也

空空如也

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

TA关注的人

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