![](https://img-blog.csdnimg.cn/33f2ce88f83b4176acf04fa321235d7f.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
剑指Offer
文章平均质量分 58
实践出真知,通过实际练习才能对所学知识更好的掌握!
不 良
知足,上进,不负野心!!!
展开
-
剑指 Offer 30. 包含min函数的栈
思路一:栈和辅助栈,栈是先进后出的结构。1.定义两个栈,st和min_st,st用来存储插入的元素,min_St用来存储已插入元素中最小的值,在构造函数中,先在min_st中插入一个值,INT_MAX是整形最大值,方便后续比较;2.在插入函数中,当要插入新的数据时比较min_st栈顶的元素和当前要插入st栈中的元素,将两者中小的压入到min_st栈中;3.删除函数中,当要删除st栈中的元素时,也要删除对应的min_st中栈顶的数据,保证min_st栈中的数据时st栈中存在的;4.top和min函数直……原创 2023-06-19 10:20:40 · 235 阅读 · 12 评论 -
剑指 Offer 09. 用两个栈实现队列
双栈。栈是先进后出的机构,队列是先进先出的结构。CQueue()作为一个构造函数,在本题中不用管。1.定义两个栈pushst和popst,将pushst栈作为输入栈用于appendTail操作,popst栈作为输出栈用于deleteHead操作;2.进行appendTail操作时,直接将数据压入pushst栈中;3.进行deleteHead操作时:先检查popst和pushst是否为空,如果为空直接返回-1;如果popst为空且pushst不为空,将pushst中的数据从栈顶开始放入原创 2023-06-04 16:40:48 · 584 阅读 · 17 评论 -
剑指 Offer 57. 和为s的两个数字
双指针法:定义两个指针分别指向数组的首元素和尾元素,然后让两个指针指向的元素相加和target比较大小并根据比较结果移动指针,情况分为以下几种:如果两边指针指向的元素相加比target大,即nums[left] + nums[right] > target,那此时需要向左移动right指针,即right--;如果两边指针指向的元素相加比target小,即nums[left] + nums[right] < target,那此时需要向右移动left指针,即left++;如果两边指针指向的元素相……原创 2023-06-03 08:30:00 · 516 阅读 · 25 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
思路一:要找出在数组中出现次数超过数组长度的一半,可以利用算法库中的`sort`函数将数组排序后中间的数据就是要找的数据;再对数组进行遍历统计中间数据出现次数是否超过数组长度一半。思路二:消除不相等的,最后剩下的就是出现次数最多的。众数:一组数中出现次数最多的那个数;本题中出现次数超过一半的数字就是众数。如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。如示例中[1, 2, 3, 2, 2, 2, 5, 4, 2],每次消去两个不相……原创 2023-06-01 20:33:27 · 633 阅读 · 25 评论 -
剑指 Offer 22. 链表中倒数第k个节点
思路一:1.先定义一个节点cur,cur = head,然后向后遍历一遍链表,算出链表中元素个数count,如果链表为空,则直接返回nullptr;2.链表的尾节点是倒数第1个节点,那么倒数第k个节点从头节点开始数也就是第count - k个节点;3.再让cur = head,从头开始遍历找到第count - k个节点,返回第count - k个节点就是链表中倒数第k个节点。思路二:双指针法:1.设置快慢指针fast和slow,让fast = head; slow = head;2.让fast指针先向后走原创 2023-06-02 15:02:48 · 198 阅读 · 30 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
双指针:设定两个指针`left`和`right`分别指向数组的左边和右边,然后通过计算判断数组中这两边是奇数还是偶数并且分情况进行操作: 当`nums[left] % 2 = 0 `即左边为偶数且`nums[right] % 2 = 1`即右边为奇数时,交换然后移动左右指针;- 当`nums[left] % 2 = 1 `即左边为奇数时,`left++`即可,因为此时如果当`nums[right] % 2 = 1`,那么`right`指针是不能移动的,所以只要当`nums[left] % 2 =原创 2023-06-01 08:49:05 · 393 阅读 · 28 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
双指针法:1.先定义两个指针fast和slow分别记录链表中当前节点,再定义两个变量nA和nB用来记录链表中节点个数;2.然后分别遍历这两个链表,统计链表中节点个数,然后计算出节点个数差值dif并让节点个数多的链表先向前移动dif步;3.再然后就是让两个指针同时向后移动,当两个指针相等时指针指向的就是两个链表的第一个公共节点。哈希集合:unordered_set容器即无序set容器,和set容器唯一的区别就是set容器会自行对存储的数据进行排序,而unordered_set容器不会……原创 2023-05-31 20:20:13 · 760 阅读 · 12 评论 -
剑指 Offer 25. 合并两个排序的链表
思路一:申请一个头节点preHead,然后再申请一个节点prev,让prev = preHead,然后通过向后遍历和比较l1和l2两个链表,同时将其中值较小的节点链接到prev的后面,直至将其中一个链表遍历结束。当其中一个为空之后,找出哪个不为空,然后将该链表接入到新链表中。注意返回的时候返回的是头节点的下一个节点即preHead->next……原创 2023-05-30 08:00:00 · 396 阅读 · 8 评论 -
剑指 Offer 18. 删除链表的节点
双指针法:因为题目中保证链表中节点的值互不相同,所以我们可以通过比较链表中节点值是否和val相等来删除节点。链表头节点为空的情况就不再细说,直接返回nullptr,情况1.先判断头节点是否等于val,如果等于val直接返回头节点的下一个节点即返回head->next;情况2.如果头节点不等于val,则设置两个节点prev和cur分别记录上一个节点和当前节点,如果cur节点的值等于val,则prev节点的next指针指向cur节点的下一个节点即原创 2023-05-28 18:53:02 · 1017 阅读 · 9 评论 -
剑指 Offer 06. 从尾到头打印链表
思路一:使用reverse函数完成链表的逆序打印。我们通过遍历将链表中的值插入数组中,然后使用reverse完成数组元素的翻转,对数组元素翻转之后打印出的数组元素顺序即是链表从尾到头打印的顺序;思路二:我们可以通过修改链表中next指针的指向,先将链表反转,假设原链表为1->2->3->4->5->nullptr,反转后为5->4->3->2->1->nullptr;然后我们再申请一个数组,通过遍历新链表中的值放入数组中,此时数组中的值就已经是原链表中从尾到头的值;思路三:根据栈的先进后出……原创 2023-05-29 10:00:00 · 705 阅读 · 14 评论 -
剑指 Offer 58 - I. 翻转单词顺序
逆序双指针:1.用n记录当前字符串长度,再开辟一个新的字符串str用来存放逆序遍历到的单词;2.逆序遍历,当字符不为空格时,使用right记录下当前i的位置,然后i--向前查找下一个空格,当s[i] == ' '时,可以通过right - i 得到当前单词的长度,i + 1得到单词的首字母,通过substr函数将该单词放到新的字符串str中;3.当我们逆序遍历完成之后,得到新的字符串,此时str已经是原来字符串翻转后形成的……原创 2023-05-25 11:27:25 · 1139 阅读 · 14 评论 -
剑指 Offer 24. 反转链表
双指针法:可以通过改变链表中节点的next指针的指向从而实现链表的反转,1.设置两个节点prev和cur,cur表示当前节点,prev表示当前节点的上一个节点,初始状态设置为prev = nullptr; cur = head;再设置一个结点tmp记录cur的下一个结点,即tmp = cur……递归:递归法和双指针法的逻辑相同,也是通过改变指针的指向从而实现反转。1.递归函数中当cur不为空的时候,先记录下cur节点的下一个节点,再改变cur节点的next指针使其指向prev……原创 2023-05-23 17:31:38 · 789 阅读 · 29 评论 -
剑指 Offer 58 - II. 左旋转字符串
思路一:可以实例化一个新的string类的字符串,先将原字符串中下标为k的元素开始将其赋值到新的字符串中,再将原子符串中从0开始到k-1的元素赋值到新字符串中……思路二:通过反转函数实现旋转……原创 2023-05-22 09:32:44 · 387 阅读 · 22 评论 -
剑指 Offer 05. 替换空格
可以通过实例化一个新的string对象用来存放新的字符串,通过将原有字符串遍历,遇到空格的地方就将%20放入新的字符串,没有空格就将原有字符放入新的字符串,依次向后遍历……最后再将新的字符串res赋值给str并返回。同时可以提前将新的字符串需要的空间大小计算并申请下来,减少空间的浪费……原创 2022-11-17 15:54:41 · 193 阅读 · 21 评论