剑指offer题解 带讲解 python版 第一部分

女朋友没有时间刷剑指offer,并且书有点厚,还都是c++写的,所以写了一份浓缩的python版的剑指offer,七夕节礼物。大多数都是最优解,不是最优解的几个题是因为最优解不好记,次优的容易记。
全手打@转载请注明出处

目录

  • 1、二维数组查找
  • 2、替换空格
  • 3、从尾到头打印链表
  • 3、重建二叉树
  • 4、两个栈实现队列
  • 5、旋转数组最小数字
  • 6.斐波那契数列
  • 7、跳台阶
  • 8 变态跳台阶
  • 9、矩形覆盖
  • 10、二进制中1的个数
  • 11、整数次方
  • 13、o(1)时间内删除链表节点
  • 14、调整数组奇数位于偶数前面,并保证相对位置
  • 15、链表倒数第k个节点
  • 16、链表反转
  • 17、合并两个有序链表
  • 18、树的子结构
  • 19、求二叉树的镜像
  • 20、螺旋打印矩阵
  • 21、包含min函数的栈
  • 22、判断栈的压入弹出序列
  • 23、层次遍历二叉树
  • 24、判断序列是不是二叉树的后序遍历
  • 25、二叉树和为某值的路径
  • 26、复制带random的链表
  • 27、二叉搜索树转双向链表
  • 28、数组中大于一半的数
  • 29、数组最小k个数
  • 30、连续子数组的最大和
  • 31、1到n整数中1出现的次数
  • 32、把数组组合成最小的数
  • 33、丑数
  • 34、找出字符串中只出现一次的
  • 35、数组中的逆序对?
  • 36、链表的第一个公共节点
  • 37、数字在排序数组中出现的次数
  • 38、二叉树的深度
  • 39、判断是否是平衡二叉树
  • 40、数组中只出现奇数次的数字
  • 41、找出数组只出现一次的 两个数字
  • 42、数组中和为s的两个数字
  • 43、和为s的所有连续正数序列
  • 44、翻转单词顺序列
  • 45、左旋字符串
  • 46、n个骰子的点数和的概率
  • 47、判断扑克是不是顺子
  • 48、求1....加到n,
  • 49、不用加减乘除做加法
  • 50、字符串转整数
  • 51、树中两节点的最低公共祖先

1、二维数组查找

剑指offer题解 带讲解 python版 第一部分_第1张图片剑指offer题解 带讲解 python版 第一部分_第2张图片
选取从右上角开始或者左上角开始,必须是一个方向变大,一个方向变小。
剑指offer题解 带讲解 python版 第一部分_第3张图片

2、替换空格

在这里插入图片描述
在申请一个比原字符串长“空格数*2”长度空间,然后倒着复制,遇到空格就往里加 0 、2、 %。
剑指offer题解 带讲解 python版 第一部分_第4张图片

3、从尾到头打印链表

在这里插入图片描述
方法一:很简单
剑指offer题解 带讲解 python版 第一部分_第5张图片
方法二:递归本质就是个栈,所以递归到头之后回来的过程中,将值加入列表中。
剑指offer题解 带讲解 python版 第一部分_第6张图片

3、重建二叉树

剑指offer题解 带讲解 python版 第一部分_第7张图片
剑指offer题解 带讲解 python版 第一部分_第8张图片
只写出一个范例,剩下用递归解决就好
剑指offer题解 带讲解 python版 第一部分_第9张图片

4、两个栈实现队列

思想就两个栈,负负得正,总是往第一个栈入队,第二个栈用来出队,第二个栈空的时候,把第一个栈的数全拿过来
剑指offer题解 带讲解 python版 第一部分_第10张图片

5、旋转数组最小数字

剑指offer题解 带讲解 python版 第一部分_第11张图片
o(logn)时间复杂度。用二分法,
剑指offer题解 带讲解 python版 第一部分_第12张图片

6.斐波那契数列

斐波那契[0,1,1,2,3…] k>=2时,再执行k-1次加和就是第n项
剑指offer题解 带讲解 python版 第一部分_第13张图片

7、跳台阶

一样的问题,凑出来的(2,number+2)
剑指offer题解 带讲解 python版 第一部分_第14张图片

8 变态跳台阶

可以从前面任意台阶过来,所有等于前面所有方法总和 + 一步跳过来这种方法
剑指offer题解 带讲解 python版 第一部分_第15张图片

9、矩形覆盖

还是斐波那契数列问题,不过初始化是【0,1,2】了 ,
剑指offer题解 带讲解 python版 第一部分_第16张图片

10、二进制中1的个数

剑指offer题解 带讲解 python版 第一部分_第17张图片
剑指offer题解 带讲解 python版 第一部分_第18张图片

11、整数次方

题不难,细节比较重要,主要考边界条件,并且有优化空间(以平方形式乘)
剑指offer题解 带讲解 python版 第一部分_第19张图片

13、o(1)时间内删除链表节点

剑指offer题解 带讲解 python版 第一部分_第20张图片
剑指offer题解 带讲解 python版 第一部分_第21张图片
如图,想删h,则将i.val赋值给h,h.next指向j,再删除i节点就行了

14、调整数组奇数位于偶数前面,并保证相对位置

剑指offer题解 带讲解 python版 第一部分_第22张图片
1.若不需要保证相对位置:
剑指offer题解 带讲解 python版 第一部分_第23张图片
剑指offer题解 带讲解 python版 第一部分_第24张图片
2.若保留相对位置:
新建一个数组,遍历,奇数放前面 或者
冒泡思想,相邻两个前是偶数后是奇数就交换

15、链表倒数第k个节点

剑指offer题解 带讲解 python版 第一部分_第25张图片
先让第一个指针走k步,然后第二个指针和第一个一起走到头,第一个指针就指向倒数第k个,
题主要考察三个边界条件:
1.k=0 2.长度不够k 3.输入的是空链表
剑指offer题解 带讲解 python版 第一部分_第26张图片

16、链表反转

剑指offer题解 带讲解 python版 第一部分_第27张图片

17、合并两个有序链表

只需要考虑一下,如果一个链表遍历完了,另一个直接接在新链表后面
剑指offer题解 带讲解 python版 第一部分_第28张图片

18、树的子结构

在这里插入图片描述
分两步:1.树1中找到树2的根节点
2.找到之后,对比左右子树是否相等
剑指offer题解 带讲解 python版 第一部分_第29张图片

19、求二叉树的镜像

交换根节点的左右子树,然后对左右子树继续递归
剑指offer题解 带讲解 python版 第一部分_第30张图片

20、螺旋打印矩阵

剑指offer题解 带讲解 python版 第一部分_第31张图片
难点是边界条件复杂,多个循环
剑指offer题解 带讲解 python版 第一部分_第32张图片
剑指offer题解 带讲解 python版 第一部分_第33张图片
剑指offer题解 带讲解 python版 第一部分_第34张图片

21、包含min函数的栈

在这里插入图片描述
比较简单,就判断下pop出去的数 是不是在minStack里就行
剑指offer题解 带讲解 python版 第一部分_第35张图片

22、判断栈的压入弹出序列

用一个栈和一个队列来模拟,如果栈顶和队列头部元素相同,同时pop掉,若最后栈是空的代表对
剑指offer题解 带讲解 python版 第一部分_第36张图片

23、层次遍历二叉树

用队列,每次放节点时,把他的左右子树也放到尾部
剑指offer题解 带讲解 python版 第一部分_第37张图片

24、判断序列是不是二叉树的后序遍历

递归的判断 是否前面的都比根节点小,后部分比根节点大,index记录的是左右子树临界点,再分别判断左右子树
剑指offer题解 带讲解 python版 第一部分_第38张图片

25、二叉树和为某值的路径

【:】和【】卡了半天 不知道有啥区别 导致结果完全不一样
剑指offer题解 带讲解 python版 第一部分_第39张图片

26、复制带random的链表

用字典 将原链表和新链表各节点地址做一个映射
剑指offer题解 带讲解 python版 第一部分_第40张图片

27、二叉搜索树转双向链表

剑指offer题解 带讲解 python版 第一部分_第41张图片
二叉搜索树是有序的,只要中序遍历,就是一个从小到大有序的序列
1.双向链表表头一定是最左的节点
2. 表尾不断以中序遍历方式向右移动:
和遍历到的节点 相互指向,然后 将表尾更新到当前节点 循环
剑指offer题解 带讲解 python版 第一部分_第42张图片

28、数组中大于一半的数

排序之后,中间的数就是答案,但是时间复杂度是 nlogn,面试时可以先说出来,然后在改
时间复杂度n的方法:
初始化一个count result设置为数组第一个,如果碰到相同的,+1,否则-1,当减到0时候更换result为当前的,count归为1,最后记得验证一下 还是o(n)
剑指offer题解 带讲解 python版 第一部分_第43张图片

29、数组最小k个数

top k问题,
两种:一种直接全排序,去前k个 ,时间复杂度nlogn
另一种最小堆,维护k大小的最小堆,时间复杂度 nlogk
##########################

30、连续子数组的最大和

动态规划 很简单
剑指offer题解 带讲解 python版 第一部分_第44张图片

31、1到n整数中1出现的次数

在这里插入图片描述
有一个时间复杂度低的,我没看,不好记规律,
粗暴的:
剑指offer题解 带讲解 python版 第一部分_第45张图片

32、把数组组合成最小的数

用cmp
剑指offer题解 带讲解 python版 第一部分_第46张图片

33、丑数

剑指offer题解 带讲解 python版 第一部分_第47张图片
记住两个答案,脱口而出最low的 然后再假装思考,想出来最优的 ,比较真实,不像做过这道题的样
粗暴: 牛客超时了
剑指offer题解 带讲解 python版 第一部分_第48张图片
正常;用数组记录得到的所有丑数,每次用之前的丑数 求出来个比当前仅大一点点的丑数
剑指offer题解 带讲解 python版 第一部分_第49张图片

34、找出字符串中只出现一次的

剑指offer题解 带讲解 python版 第一部分_第50张图片

35、数组中的逆序对?

等等补充

36、链表的第一个公共节点

剑指offer题解 带讲解 python版 第一部分_第51张图片

37、数字在排序数组中出现的次数

一种 o(n) 可以用字典计数
另一种logn ,用两次二分查找 分别找出第一次出现的k 和最后一次出现的K, 算距离,注意考虑不存在k的情况
剑指offer题解 带讲解 python版 第一部分_第52张图片

38、二叉树的深度

递归,找出最大能走下去的长度就是
剑指offer题解 带讲解 python版 第一部分_第53张图片
非递归

39、判断是否是平衡二叉树

在上道题的基础上,递归的判断 是否左右子树的深度绝对值差都不大于1
剑指offer题解 带讲解 python版 第一部分_第54张图片

40、数组中只出现奇数次的数字

异或操作:两数相同 就为0
剑指offer题解 带讲解 python版 第一部分_第55张图片

41、找出数组只出现一次的 两个数字

在这里插入图片描述
就不能用字典计数了,利用上一题思想,将数组分为两个,每一个都包含一个只出现一次的数字,怎么分呢?
在这里插入图片描述
剑指offer题解 带讲解 python版 第一部分_第56张图片
怎么知道异或结果中1的位置呢?
在这里插入图片描述
那么怎么判断倒数第二位是不是1呢?
剑指offer题解 带讲解 python版 第一部分_第57张图片
整体程序:
剑指offer题解 带讲解 python版 第一部分_第58张图片

42、数组中和为s的两个数字

在这里插入图片描述
剑指offer题解 带讲解 python版 第一部分_第59张图片

43、和为s的所有连续正数序列

剑指offer题解 带讲解 python版 第一部分_第60张图片

剑指offer题解 带讲解 python版 第一部分_第61张图片
剑指offer题解 带讲解 python版 第一部分_第62张图片

44、翻转单词顺序列

将每个单词的每个字母合并为一个字符,然后翻转整个单词序列,这样可以保证每个单词顺序没变
剑指offer题解 带讲解 python版 第一部分_第63张图片

45、左旋字符串

两种方法:
1.简单 但是low一点:
剑指offer题解 带讲解 python版 第一部分_第64张图片
2.看着高端的解法
先将整个字符串翻转,这样需要左移的k位都跑最后去了, 然后分别对两部分翻转就恢复了
abcXYZ -> ZYXcba ->XYZ + abc
剑指offer题解 带讲解 python版 第一部分_第65张图片

46、n个骰子的点数和的概率

在这里插入图片描述
扔第n个骰子的时候的sum,只能由第n-1个骰子时候的值得来
f(n,s)=f(n-1,s-1)+f(n-1,s-2)+f(n-1,s-3)+f(n-1,s-4)+f(n-1,s-5)+f(n-1,s-6) ,
剑指offer题解 带讲解 python版 第一部分_第66张图片

47、判断扑克是不是顺子

剑指offer题解 带讲解 python版 第一部分_第67张图片

剑指offer题解 带讲解 python版 第一部分_第68张图片

48、求1…加到n,

在这里插入图片描述
用and来充当判断语句
在这里插入图片描述

49、不用加减乘除做加法

第一种 return sum(a,b),面试先说,肯定不合格
第二种死记硬背,不会
剑指offer题解 带讲解 python版 第一部分_第69张图片
剑指offer题解 带讲解 python版 第一部分_第70张图片
剑指offer题解 带讲解 python版 第一部分_第71张图片

50、字符串转整数

边界条件是考察点
“+” “-” 字母 空的这四种
不用int 可以用 ord(s) - ord(“0”)来得单个数字
剑指offer题解 带讲解 python版 第一部分_第72张图片

51、树中两节点的最低公共祖先

1.如果是二叉搜索树:如果两节点比父节点大,在右子树中找,如果一个比当前节点大,一个比当前节点小,则当前节点就是公共祖先,

2.如果有指向父节点的指针,则每个叶子节点都是一个链表的表头,找出含有两节点的两个链表,转化为求两链表的公共节点
剑指offer题解 带讲解 python版 第一部分_第73张图片
3.如果只是普通的二叉树
如果左右子树各有一个目标节点,则返回当前节点
如果左面没有,那就递归右子树,反之
剑指offer题解 带讲解 python版 第一部分_第74张图片

你可能感兴趣的:(算法题)