题目 | 难度 | 简要思路梳理 |
[剑指offer]-从尾到头打印链表 | ☆ | 即链表逆序,如果不能改变原始链表结构,可用栈 |
[剑指offer]-链表中倒数第K个节点 | ☆ | 双指针法 |
[剑指offer]-合并两个排序的链表 | ☆ | 先获取新链表头(两链表最小的头),然后按照递增方式连接,最后将某一个剩余一段的链表直接接上。 |
[剑指offer]-复杂链表的复制 | ☆☆☆ | 细心!!分三步:1,复制每个节点,插在其后;2,复制每个旧节点的random到新节点;3.拆分节点。 |
[剑指offer]-圆圈中最后剩下的数 | ☆☆☆ | 约瑟夫环问题,采用STL中的list构成环形链表。 |
题目 | 难度 | 简要思路梳理 |
[剑指offer]-用两个栈实现队列 | ☆ | 模拟队列先进先出,一个栈存数据,另一个栈临时放数据。 |
[剑指offer]-包含min函数的栈 | ☆ | 设置两个栈,一个存放数据,一个存放每一步数据栈中最小的数。 |
[剑指offer]-栈的压入、弹出序列 | ☆☆☆ | 用一个栈来模拟压入弹出操作。 |
题目 | 难度 | 简要思路梳理 |
[剑指offer]-重建二叉树 | ☆☆☆ | 采用递归的方式不断找出根节点和左右子树 |
[剑指offer]-树的子结构 | ☆☆☆☆ | 第一步在树A中找到和B的根结点的值一样的结点R,第二步再判断树A中以R为根节点的子树是不是包含和树B一样的结构。 |
[剑指offer]-二叉树的镜像 | ☆☆ | 先交换根节点的左右子节点,再将子节点作为根节点进行递归镜像操作。 |
[剑指offer]-从上往下打印二叉树 | ☆ | 根节点入队列,然后出队列,出队时将其左右孩子入队,循环操作进行队列出队,每次出队将其左右孩子入队。当队列为空时,整棵树层序遍历完毕。 |
[剑指offer]-二叉搜索树的后序遍历序列 | ☆☆ | BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定义。 |
[剑指offer]-二叉搜索树与双向链表 | ☆☆ | 改造中序遍历,设置一个pre和cur,将中序遍历打印的过程替换为前后连接pre和cur |
[剑指offer]-二叉树深度 | ☆ | 采用尾递归的方式 |
[剑指offer]-判断树是否为平衡二叉树 | ☆☆ | 性质:是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 因此递归函数每次要计算出子树的高度。 |
题目 | 难度 | 简要思路梳理 |
[剑指offer]-二维数组的查找 | ☆ | 从右上角到左下角进行查找 |
[剑指offer]-旋转数组的最小数字 | ☆☆☆ | 采用分治的思想,递归地将数组进行二分区,然后找到最小的数(时间复杂度logn 顺序查找O(n)) |
[剑指offer]-斐波那契数列 | ☆ | 很简单,考虑节省空间复杂度,用循环代替递归。 |
[剑指offer]-调整数组顺序使奇数位于偶数前面 | ☆ | 用两个指针,一个遍历数组,一个指向存放奇数的位置,都从0开始,偶数暂时放在另一个vector中,先将奇数存放在奇数指针指向的位置,最后再存偶数。 |
[剑指offer]-顺时针打印矩阵 | ☆☆ | 考虑全面:m×n,m×1,1×n,1×1几种情况都要考虑;流程控制采用top、down、left、right四个变量来控制。 |
[剑指offer]-数组中出现次数超过一半的数字 | ☆☆ | 在遍历数组时保存两个值:一是数组中一个数字,一是次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。遍历结束后,所保存的数字即为所求。 |
[剑指offer]-最小的K个数 | ☆ | TOPk问题 |
[剑指offer]-在排序数组中查找数字 | ☆☆ | 考虑查找效率,总体思路是找到第一个K位置和最后一个K的位置,作差加一求出个数。可以采取递归方式二分查找,也可直接通过循环二分查找,不过大神的通过查找K-0.5和K+0.5更加简洁高效。 |
[剑指offer]-数组中只出现一次的两个数字 | ☆☆ | 先将所有数依次异或,结果和两个单一数异或相同,从右开始找到结果中第一个为1的位,以此为标准将数分成两类,再将两类分别异或,得到的就是两个单数。注意大坑!!! a & flag != 0;和(a & flag) !=0;结果不同。 |
[剑指offer]-和为S的连续正数序列 | ☆☆ | 用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small到big的序列的和大于s,则可以从序列中去掉较小的值,也就是增大small的值。如果从small到big的序列的和小于s,则可以增大big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,我们一直增加small到(1+s)/2为止。 |
[剑指offer]-和为S的两个数字 | ☆☆ | 类似与57(2).和为S的连续正数序列.note做法,只不过,只不过本题左指针开始指向数组最左端,右指针指向最右端。 |
[剑指offer]-扑克牌顺子 | ☆☆ | 第一步:排序;第二步:统计0的个数,统计间隙的个数;第三步:间隙数大于0个数返回false,间隙数小于0的个数,更新0的个数,继续统计后面的数字是否有间隙。同时在此过程中也要统计前后两个数是否有重复情况,重复返回false。 |
[剑指offer]-数组中重复的数字 | ☆☆ | 从头到尾依次扫描数组元素,当扫描到第i个元素m时,当m等于i时,继续遍历下一元素,当不等于i时,则拿他与第m个数n比较,如果m=n,则找到重复元素,返回true,否则交换两元素... |
[剑指offer]-构建乘积数组 | ☆☆ | 求B[i]的时候分为两步,先求左侧所有的A相乘,再求右侧的所有的A相乘,最终将两者相乘即得相应的B。具体通过两次循环,累乘得到不同的B[i] |
题目 | 难度 | 简要思路梳理 |
[剑指offer]-不用加减乘除做加法 | ☆☆ | a^b代表不进位的二进制加法,(a&b)<<1为二进制加法所有的进位信息,然后通过循环或者递归,直到进位为0。 扩展题:不使用新的变量,交换两个变量的值 |
题目 | 难度 | 简要思路梳理 |
[剑指offer]-二进制中1的个数 | ☆ | 要考虑到负数这种情况,右移数还是左移相与的数? |
[剑指offer]-字符串的排列 | ☆☆ | 采用递归回溯的方式实现,要考虑字符的重复,输出结果是否为字典序。 |
[剑指offer]-1~n整数中1出现的次数 | ☆☆☆ | 设定整数点(如1、10、100等等)作为位置点i,求每个位置点为1时的数有多少个,再算出所有情况 //根据设定的整数位置,对n进行分割,分为两部分,高位n/i,低位n%i |
[剑指offer]-把数组排成最小的数 | ☆☆ | 要会用数字转字符串函数 to_string(number1),会写sort()的cmp函数。 |
[剑指offer]-丑数 | ☆☆☆ | 一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z |
[剑指offer]-第一次只出现一次的字符 | ☆☆ | 采用hash思想,用int map[256]统计字符串中字符的个数,然后从头遍历字符串,到map[256]中寻找对应值,如果为1,则返回。 |
[剑指offer]-字符流中第一个只出现一次的字符 | ☆☆ | 和上题类似,只是字符串S和map[256]作为类的成员变量,每次调用insert()函数时,从字符流中添加一个字符到S的结尾,同时,更新map[256]中对应位,findFirst()仍然按照字符串顺序,遍历map数组。 |
[剑指offer]-求1+2+…+n | ☆☆ | 采用递归代替循环,用&&代替if条件语句。 |
[剑指offer]-把字符串转换成整数 | ☆☆ | (1)字符串指针是否为空,字符串长度是否为0; (2)考虑字符串的正负,正数要考虑带不带正号; (3)确保除了符号位以外所有的字符必须都是0~9之间的几个字符,否则返回0. |
☆☆☆ | 分多种情况考虑,具体分析见链接 | |
[剑指offer]-左旋转字符串 | ☆ | 主要熟悉下string类的一些函数的操作2.16 C++ string类详解.note |
[剑指offer]-替换空格 | ☆☆ | 在同一个字符数组中,通过两个指针进行空格和%20的替换。 |