剑指offer_C++实现
用C++实现剑指offer的所有题目以及解题思路。
给你。
这个作者很懒,什么都没留下…
展开
-
JZ52 两个链表的第一个公共结点
i到达list1终点后继续去遍历list2, j到达list2的终点后继续去遍历list1, 第二次遍历两个游标肯定在第一个公共结点相遇。剑指offer P253解题思路1:两个链表全部入栈,然后对比栈顶结点,如果相同,同时弹出,直到找到最后一个相同结点。思路3:用双指针,遍历这两个链表,用一个游标i去遍历list1, j 去遍历list2,解题3:游标走完一个链表然后去走第二个链表,只走一次,需要设置标志位。先让长的链表走K步,然后再同步走,第一个相同的结点就是公共结点。2.长的链表先走k步。原创 2024-08-19 12:15:34 · 180 阅读 · 0 评论 -
JZ51 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。先把数组分割成小小数组,统计出数组内部的逆序对的数目,然后再统计出两个相邻数组之间的逆序对数目。在统计逆序对的过程中,还要对数组进行排序。要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)数组中所有数字的值满足 0≤val≤1090≤val≤109。时间复杂度:用到归并排序O(nlogn),空间复杂度O(N)题目保证输入的数组中没有的相同的数字。原创 2024-08-19 11:36:55 · 140 阅读 · 0 评论 -
JZ22 链表中倒数最后k个结点
【代码】JZ22 链表中倒数最后k个结点。原创 2024-08-18 04:45:22 · 121 阅读 · 1 评论 -
JZ21 调整数组顺序使奇数位于偶数前面(一)
输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。原创 2024-08-18 04:27:41 · 85 阅读 · 0 评论 -
JZ20 表示数值的字符串
例如,字符串["+100","5e2","-123","3.1416","-1E-16"]都表示数值。但是["12e","1a3.14","1.2.3","+-5","12e+4.3"]都不是数值。-如果没有E或者e不会走这个语句------?---匹配0或者1个括号里面的。6.^--以xxx开头,$-以XXX结尾----可有可无,没有也可以编译通过。-d+:1一个或者多个数字---有E后面肯定有数字。---0个或者1个+或--[Ee]---只匹配一个。0个或者1个+或者-原创 2024-08-18 03:46:28 · 111 阅读 · 0 评论 -
JZ18_删除链表的结点
3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点。给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。2.题目保证链表中节点的值互不相同。1.此题对比原题有改动。原创 2024-08-18 02:03:16 · 116 阅读 · 0 评论 -
JZ17_打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。2. n 为正整数,0 < n <= 5。----2分钟直接秒了........1. 用返回一个整数列表来代替打印。原创 2024-08-18 01:51:26 · 71 阅读 · 0 评论 -
JZ14_剪绳子
因此,当 j 固定时,有 dp[i]=max(j×(i−j),j×dp[i−j])。dp[i]: 将整数i拆分成至少两个整数的和之后,这些整数最大的乘积,每个正整数对应的最大乘积取决于比它小的正整数对应的最大乘积。将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j×dp[i−j]将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j×(i−j);JZ14和leetcode343整数拆分得到的乘积最大基本是一道题。原创 2024-08-18 01:45:18 · 250 阅读 · 0 评论 -
JZ16 数值的整数次方
只需要判断exponent是否为负整数就行。原创 2024-08-18 01:20:08 · 70 阅读 · 0 评论 -
JZ15_二进制中1的个数
如果i的最低为为0, 那么dp[i] = dp[ i >> 1];//i的最低为为0,二进制数量和 i 右移1位是一样的。如何判断某个数的最低位是1还是0?-------> n & 1 == 1---最低位为1, n&1 == 0最低位为0。如果i的最低位为1, 那么dp[i] = dp[i-1] + 1;dp[i]: 数字 i二进制中含有1的个数。n&(n-1):消除最低位的1.对应leetcode_338。原创 2024-08-18 01:06:05 · 46 阅读 · 0 评论 -
JZ11_旋转数组的最小数字--有重复值
2.对于有重复的数字-有一种特殊情况,如果nums[left] = nums[mid]= nums[right],无法知道最小值在哪个区间,需要切到顺序查找。1.旋转数组的最小数字-无重复值代码实现-leetcode-153。原创 2024-08-18 01:00:05 · 116 阅读 · 0 评论 -
JZ9_两个栈实现一个队列
2.2 如果stack1不为空,但是stack2为空:把stack1依次出栈的元素push到stack2,然后再让stack2出栈。2.3.如果stack2是不为空的,直接从stack2出栈。1.用一个栈进行正常的入队,无脑pushback即可。2.1 如果两个栈都为空,返回-1;2.出栈的时候,有三种情况。原创 2024-08-18 00:53:32 · 146 阅读 · 0 评论 -
JZ8_二叉树中序遍历的下一个结点
思路:给定一个结点pNode,它的中序遍历的下一个结点有可能是它的父亲,因此,需要自底向上地将比它辈分高的结点全部先入栈。当出栈结点等于pNode的时候,说明下一个出栈结点就是所要求的结果。给出某二叉树的中序遍历的某个结点,求其下一个结点,其中二叉树除了有left、right指针指向左右孩子,还有一个next指针指向其父亲。-b1.遍历当前结点,把其左孩子全部入栈。-b3.pCur指向栈顶结点的右孩子。b.在pCur不为空或者栈不为空的时候进入循环。2.求二叉树中序遍历的下一个结点。原创 2024-08-18 00:48:59 · 168 阅读 · 0 评论 -
JZ7_用前序遍历和中序遍历重建二叉树
【代码】JZ7_用前序遍历和中序遍历重建二叉树。原创 2024-08-18 00:32:48 · 73 阅读 · 0 评论 -
JZ6_从头到尾打印链表
【代码】JZ6_从头到尾打印链表。原创 2024-08-18 00:24:27 · 280 阅读 · 0 评论 -
JZ5_替换空格
数据范围:0≤len(s)≤1000 0≤len(s)≤1000。保证字符串中的字符为大写英文字母、小写英文字母和空格中的一种。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。请实现一个函数,将一个字符串s中的每个空格替换成“%20”。原创 2024-08-18 00:23:21 · 188 阅读 · 0 评论 -
Jz3_数组中重复的数字
空间复杂度的计算主要关注于算法运行时的额外空间使用,而不包括函数运行时所需的栈空间(如参数、局部变量、寄存器信息等),因为这部分空间在编译期间已经确定,不属于运行时的额外空间。P41解释:所有操作步骤都是在输入数组上进行的,不需要分配额外的内存,因此空间复杂度为O(1).关于空间复杂度:数组用容器vector来存储,空间复杂度为O(n),2. 书中的解法思路:数组元素和下标一 一对应,时间复杂度O(N)1.---排序+双指针-时间复杂度O(nlogn),书中解法-剑指offer-P40。原创 2024-08-18 00:19:52 · 123 阅读 · 0 评论