[剑指offer]-导航总结篇

链表
题目难度简要思路梳理
[剑指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的替换。

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值