剑指offer总结

剑指offer总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
不管是应届生求职还是职场跳槽,都逃不过数据结构算法的考察,而刷算法题都必须刷一边剑指offer。但是可能刷完就忘记了,于是我就吧自己的刷题笔记总结了一下,下边是我刷的时候遇到的问题,可能不完善,希望对大家有帮助!

常出现的问题: 传入参数是否为引用,符合条件后的指针移动,边界条件的理解,while循环内的指针移动;

题目列表

  1. 二维数组中的查找:从右上角,或者左下角开始并以此为指针开始遍历比较移动。(数组)
  2. 替换空格:空间增加的从后往前填写;char* str ,int length => str[i].
  3. 从尾到头打印链表: 三个临时节点来将链表反顺序。 (链表)
  4. 重建二叉树:前序遍历根节点为左边第一个数;根据这个值找到中序遍历的根节点值位置,并以此位置为界限将数分为左子树的值和右子树的值。递归。
  5. 用两个栈实现队列:栈1进;栈2为空就将栈1全部转移到栈2,然后栈2出 (栈)
  6. 旋转数组的最小数字:首先判断是否有序,有序则第一个为最小值; 中间值是否大于末端,最小值在后半段, 中间值小于末端,最小值在前半段,中间值等于末端,无法确定,从末端最小区间。(二分法)
  7. 斐波那契数列,初始值,动态规划,空间优化。(动态规划)
  8. 跳台:由于可以跳1和2个台阶,所以第n个可以由n-1和n-2台阶到达。初始值,动态规划,空间优化。
  9. 变态跳台:由于可以跳任意阶,所以第n可以由之前所有的台阶到达。又由于dp[n]=dp[n-1]+dp[n-2]+…dp[1],dp[n]=2*dp[n-1].初始值,动态规划,空间优化。
  10. 矩形覆盖:一定要多画几个来证明自己的猜想。for循环里的i是用来计数的!(开始结束可以改变但是总的计数次要一样)。初始值,动态规划,空间优化。
  11. 二进制中一的个数: 技巧: n & (n-1)可以从右往左依次除去n的1;(进制转换)
  12. 数值的整数次方:首先将次方的负号变正号;然后写递归函数,出口当指数等于0,递归表达式,判断指数的奇偶性,然后写出相应表达式。(递归)
  13. 调整数组顺序使得奇数位于偶数前面:利用辅助数组先装奇数,后装偶数,然后将这个数组赋给原数组。 (数组)
  14. 链表中第K个节点: 快慢指针,一定要检查链表长度是否大于等于K;(链表)
  15. 反转链表:temp;cur;pre; (链表)
  16. 两个合并排序的链表:将讲不清的情况用if else分开说明白 ;cur->next可以将链表链接起来,后边跟节点就可以。(链表)
  17. 树的子结构:递归return的传递性,判断用的递归,主函数也是递归。 (二叉树)
  18. 二叉树的镜像: 递归必须有返回值。(二叉树)
  19. 顺时针打印矩阵:一般,vector<vector> a ;a.size()是矩阵的行数,a[0].size()是矩阵的列数。(数组)
  20. 包含min函数的栈:两个栈,装数字的时候一个正常装,另一个只装最小值。(栈)
  21. 栈的压入弹出序列:模拟栈的压入弹出过程,当栈顶与弹出序列队列头部相同时,同时弹出元素。(不要忘记相等的前提是栈不为空) (栈、队列)
  22. 从上往下打印二叉树:用队列装需要打印的节点。(二叉树)
  23. 二叉搜索树的后续遍历:后续遍历最后一个数为根节点,比较得出前后左右子树,然后判断后面的是否有比根节点小的,有的话就false,没有就继续递归。(二叉查找树)
  24. 二叉树中和为某一值的路径:首先相同起点的遍历:程序开始段存入,结尾弹出(回溯)。利用减法 每层递归减去当前值,可以减少空间开销。还有最重要的是看清楚题目,分析出递归的出口条件。 (二叉树)
  25. 复杂链表的复制:如右边图所示 画图写程序!一定不要忘记迭代项表达式! (链表)
  26. 二叉搜索树双向链表:先中序遍历顺序存储节点然后改变指针指向。(树,链表)第二种方法去看看
  27. 字符串的排列:一定要记住开头交换 结尾交换回来(回溯),可以遍历所有排列顺序,但是有重复的话可以用set去重。 递归的出口交换到最后一个数字的时候!(回溯)
  28. 数组中出现次数超过一半的数字:候选法,设置一个数,和计数器,遍历数组,计数器为零替换该数,否则相同++,不同–,最后剩下的数进行遍历统计,大于数组大小一半,返回该数,否则返回0.(数组)
  29. 最小k个数:做了一天! 1.用大顶堆维护k个数,然后输出。2.用快速排序的思想,将碰运气的小于index个数和大于它的数分出来,index<k,从index+1开始继续排;index>k,从0~index,再排。(堆、快速排序)
  30. 累加最大:如果数字累加后小于零舍去这段数字和,temp=0; 如果还大于零,temp+=arr[i],去比较是否大于之前的ret。累加的缺点:如果所有的数字都小于零就无法使用。所以当temp==0&& ret<0时,返回数组中的最大元素 *max_element(arr.begin(),arr.end());
  31. 整数中1出现的次数:方法1:暴力,将所有的1~n的数都/10,%10,得到每个数1的个数。方法2:首先用/10算出n的长度(不能直接对n进行操作,操作完n就变了),然后将首位为1的情况算出来;计算后面位的出现1 的次数(其中首位为最大的超过n的部分的次数和首位为零其他位大于n其他位的刚好相等),return 递归n%res;(其实就是排列组合题目) (数学)
  32. 把数组排成最小的数:方法1:全排列如同27题(min()函数可以比较字符串);利用 lamda表达式和sort()函数最后参数 true正序,false逆序;
  33. 丑数:因为判断一个数是不是丑数while(n>1){n%20, n/2;n%30,n/3;n%5==0,n/5};所以第n个丑数都是2,3,5乘出来的在已生成的序列里n尽量乘最小的丑数得到下一个丑数,因此他们的index都是++;
  34. 第一个只出现一次的字符:用map<char,int>装,或者用数组代替(char在0~128之间);(键值对)
  35. 数组中的逆序对:利用归并排序的思想,分两步一个递归,一个排序。最后返回计数器的值。(归并排序)
  36. 两个链表的公共结点:必须是先判断当前结点是否为空然后进行操作;遍历条件两结点是否相等;(链表)
  37. 数字再升序数组中出现的次数:用两次二分查找得出左右边界。然后相减得出答案 (数组)
  38. 二叉树的深度:将两个递归的值计算在一起返回出口。(二叉树)
  39. 平衡二叉树:再38题的基础之上加个左右子树深度差的判断,(二叉树)
  40. 数组中出现一次的数字:补码反码一定要搞清楚!巧妙利用 K0=k,kk=0,k&(-k)得到第一个不相同的项。然后分类得到num1,num2; (二进制)
  41. 和为S的连续正数序列:滑动窗口:边移动边加,或者边移动边减。 (滑动窗口)
  42. 和为S的两个数字:双指针:符合条件之后一定要移动指针。还有循环跳出的条件是两指针重合,结果不可以重合,需要判断。Pair<int,int> (数组)
  43. 左移字符串:先把一步的函数写出来,然后需要几步就循环几次。(字符串)
  44. 翻转单词顺序列:先整个句子反转,然后逐个单词反转用交换函数。(字符串)
  45. 扑克牌顺子:排除0的情况,不能重复,最小最大值小于5. (数组)
  46. 孩子们的游戏(圆圈中最后剩下的数)advance(index,int a); arr.erase(index);
  47. 求1+2+3…+n:递归
  48. 不用加减乘除做加法:利用^ , &将每次进位分开,当num2==0;没有进位;加法完成!(二进制计算)
  49. str[i]>=‘0’,就是元素str[i]的baiASCII码大于0的ASCII码,因为ASCII码中数du字是连续编码的,即数字0-9的ASCII是连续递增的,所以str[i]>='0’就是判断zhistr[i]是不是大于等于0,通常与str[i]<='9’连用,来判断是不是数字(字符串)
  50. 使用map键值对
  51. 构建乘积数组:左边用B[]装起来,右边用temp装起来 然后乘于B[]得到结果.
  52. 正则表达式匹配:1.出口条件,2首字母是否相等 3.分类讨论下一个字符是否为‘*’;是的情况首字母相等 str++, 否的情况 pattern+=2
  53. 表示数值的字符串:
  54. 字符流中第一个不重复的字符:使用map 和 queue;map.find(), map.end()
  55. 链表中环的入口结点:一定要做判断 对是否有环;(fast && fast->next) 快慢指针的循环条件;先算出环的长度,然后得出最后倒数环长度的节点。
  56. 删除链表中重复的结点:1.建立新头节点,2二利用两个连续的节点pre,cur来删除节点,首先如果cur=cur->next和不相等情况判断是两支针一起移动还是 单cur移动。
  57. 二叉树的下一个结点:首先找到根节点,然后中序遍历得到结点序列,最后遍历得到下一个结点。
  58. 对称二叉树:虽然开始是同一个结点,一定要用两个结点的函数来说明问题!先判断结点是否为空,然后比较结点的值。(二叉树)
  59. 按之字形顺序打印二叉树:bfs,二叉树宽度遍历。如果从一开始就计数,每层压入可以被计数,level为偶数时 reverse。
  60. 把二叉树打印成多行:和上题差不多。
  61. 序列化二叉树:
  62. 二叉搜索树的第k个结点:中序遍历可以让二叉搜索树顺序排列。

注意

如想获取 具有对应题目代码的详细版本 ,请关注公众号 “狂妄之灵的编程日记” 回复 ”剑指offer“ 获取。在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值