女朋友没有时间刷剑指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、二维数组查找


选取从右上角开始或者左上角开始,必须是一个方向变大,一个方向变小。

2、替换空格


在申请一个比原字符串长“空格数*2”长度空间,然后倒着复制,遇到空格就往里加 0 、2、 %。

3、从尾到头打印链表


方法一:很简单

方法二:递归本质就是个栈,所以递归到头之后回来的过程中,将值加入列表中。

3、重建二叉树



只写出一个范例,剩下用递归解决就好

4、两个栈实现队列

思想就两个栈,负负得正,总是往第一个栈入队,第二个栈用来出队,第二个栈空的时候,把第一个栈的数全拿过来

5、旋转数组最小数字


o(logn)时间复杂度。用二分法,

6.斐波那契数列

斐波那契[0,1,1,2,3…] k>=2时,再执行k-1次加和就是第n项

7、跳台阶

一样的问题,凑出来的(2,number+2)

8 变态跳台阶

可以从前面任意台阶过来,所有等于前面所有方法总和 + 一步跳过来这种方法

9、矩形覆盖

还是斐波那契数列问题,不过初始化是【0,1,2】了 ,

10、二进制中1的个数


11、整数次方

题不难,细节比较重要,主要考边界条件,并且有优化空间(以平方形式乘)

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



如图,想删h,则将i.val赋值给h,h.next指向j,再删除i节点就行了

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


1.若不需要保证相对位置:


2.若保留相对位置:
新建一个数组,遍历,奇数放前面 或者
冒泡思想,相邻两个前是偶数后是奇数就交换

15、链表倒数第k个节点


先让第一个指针走k步,然后第二个指针和第一个一起走到头,第一个指针就指向倒数第k个,
题主要考察三个边界条件:
1.k=0 2.长度不够k 3.输入的是空链表

16、链表反转

17、合并两个有序链表

只需要考虑一下,如果一个链表遍历完了,另一个直接接在新链表后面

18、树的子结构


分两步:1.树1中找到树2的根节点
2.找到之后,对比左右子树是否相等

19、求二叉树的镜像

交换根节点的左右子树,然后对左右子树继续递归

20、螺旋打印矩阵


难点是边界条件复杂,多个循环


21、包含min函数的栈


比较简单,就判断下pop出去的数 是不是在minStack里就行

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

用一个栈和一个队列来模拟,如果栈顶和队列头部元素相同,同时pop掉,若最后栈是空的代表对

23、层次遍历二叉树

用队列,每次放节点时,把他的左右子树也放到尾部

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

递归的判断 是否前面的都比根节点小,后部分比根节点大,index记录的是左右子树临界点,再分别判断左右子树

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

【:】和【】卡了半天 不知道有啥区别 导致结果完全不一样

26、复制带random的链表

用字典 将原链表和新链表各节点地址做一个映射

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


二叉搜索树是有序的,只要中序遍历,就是一个从小到大有序的序列
1.双向链表表头一定是最左的节点
2. 表尾不断以中序遍历方式向右移动:
和遍历到的节点 相互指向,然后 将表尾更新到当前节点 循环

28、数组中大于一半的数

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

29、数组最小k个数

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

30、连续子数组的最大和

动态规划 很简单

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


有一个时间复杂度低的,我没看,不好记规律,
粗暴的:

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

用cmp

33、丑数


记住两个答案,脱口而出最low的 然后再假装思考,想出来最优的 ,比较真实,不像做过这道题的样
粗暴: 牛客超时了

正常;用数组记录得到的所有丑数,每次用之前的丑数 求出来个比当前仅大一点点的丑数

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

35、数组中的逆序对?

等等补充

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

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

一种 o(n) 可以用字典计数
另一种logn ,用两次二分查找 分别找出第一次出现的k 和最后一次出现的K, 算距离,注意考虑不存在k的情况

38、二叉树的深度

递归,找出最大能走下去的长度就是

非递归

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

在上道题的基础上,递归的判断 是否左右子树的深度绝对值差都不大于1

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

异或操作:两数相同 就为0

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


就不能用字典计数了,利用上一题思想,将数组分为两个,每一个都包含一个只出现一次的数字,怎么分呢?


怎么知道异或结果中1的位置呢?

那么怎么判断倒数第二位是不是1呢?

整体程序:

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


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


44、翻转单词顺序列

将每个单词的每个字母合并为一个字符,然后翻转整个单词序列,这样可以保证每个单词顺序没变

45、左旋字符串

两种方法:
1.简单 但是low一点:

2.看着高端的解法
先将整个字符串翻转,这样需要左移的k位都跑最后去了, 然后分别对两部分翻转就恢复了
abcXYZ -> ZYXcba ->XYZ + abc

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) ,

47、判断扑克是不是顺子

48、求1…加到n,


用and来充当判断语句

49、不用加减乘除做加法

第一种 return sum(a,b),面试先说,肯定不合格
第二种死记硬背,不会


50、字符串转整数

边界条件是考察点
“+” “-” 字母 空的这四种
不用int 可以用 ord(s) - ord(“0”)来得单个数字

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

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

2.如果有指向父节点的指针,则每个叶子节点都是一个链表的表头,找出含有两节点的两个链表,转化为求两链表的公共节点

3.如果只是普通的二叉树
如果左右子树各有一个目标节点,则返回当前节点
如果左面没有,那就递归右子树,反之

剑指offer题解 带讲解 python版 第一部分相关推荐

  1. java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数

    前言 众所周知,<剑指offer>是一本"好书". 如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白. 对于剑指offer题解这个系列,我的 ...

  2. 对分查找的最多次数_「剑指offer题解」数组中出现次数超过一半的数字

    关注我--个人公众号:后端技术漫谈 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边缘计算等方向. 原创博客主要内容 Java知识点复习全手册 Leetcode算法题解析 ...

  3. java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值

    前言 众所周知,<剑指offer>是一本"好书". 为什么这么说? 因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的. 有多高,以我目前不多的面试来 ...

  4. java 最大子数组_[剑指offer题解][Java]连续子数组的最大和

    前言 众所周知,<剑指offer>是一本"好书". 如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白. 对于剑指offer题解这个系列,我的 ...

  5. 【剑指offer题解】二维数组中的查找

    前言 众所周知,对于面试而言,<剑指offer>是一本"好书". 如果你和我一样是个算法菜鸡,那么最推荐的是先把剑指offer的题目搞明白,其次再去刷LeetCode等 ...

  6. 【LeetCode】剑指 Offer 52. 两个链表的第一个公共节点

    [LeetCode]剑指 Offer 52. 两个链表的第一个公共节点 文章目录 [LeetCode]剑指 Offer 52. 两个链表的第一个公共节点 一.双指针 一.双指针 设 "第一个 ...

  7. 剑指 Offer 52. 两个链表的第一个公共节点

    题目:剑指 Offer 52. 两个链表的第一个公共节点 ,哈哈,我们今天来看一道很简单的题嘛,这是选自剑指 Offer 上的一道题,好了,我们一起来看看题意吧: 考虑到直接复制题目,或者截屏的方式不 ...

  8. 剑指offer:跳台阶 python 实现

    题目 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 解题思路 草稿上想了想,这道题跟剑指offer: 斐波那契数列 ...

  9. 【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中

    Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offe ...

  10. 《剑指 Offer》(第 2 版) 题解(Python 语言实现)第 41-50 题

    文章目录 @[toc] 第 41 题:数据流中的中位数 第 42 题:连续子数组的最大和 第 44 题:数字序列中某一位的数字 同 LeetCode 第 400 题:[400. 第 N 个数字](ht ...

最新文章

  1. 兼容ie浏览器的placeholder的几种方法
  2. 【ES6基础】Object的新方法
  3. access找不到输入表或者dual_在Access窗体中显示指定路径的图片
  4. 安装openstack_午餐前如何安装OpenStack Cloud
  5. mysql 自动生成mapper_自动生成实体类、Mapper、Mapper.xml文件
  6. 前端开发JS的学习之AngularJS库
  7. 17 类的成员 私有
  8. base64位 解码图片
  9. 交叉验证与训练集、验证集、测试集
  10. 10款Java开源项目
  11. 微软模拟飞行10厦门航空涂装_微软飞行模拟IGN 评测 10 分:一个任你翱翔的自由世界...
  12. Excel公式中的LookUp三剑客(可以取代Vlookup的神秘公式)
  13. 面试相关-转载-well,yzl——持续更新
  14. Java输出字符串中的叠词_java中正则表达式的简单运用 | iamxiarui
  15. lucene.net和(pangu)盘古分词 搜索引擎的简单实现
  16. Notes V11内存不足?
  17. 全国高校计算机能力挑战赛试题,2019年全国高校计算机能力挑战赛 C语言程序设计决赛(示例代码)...
  18. JS 今天/明天的日期
  19. java faker_Faker--伪造数据利器
  20. Fightting for your youth

热门文章

  1. java after 函数_函数周期表丨信息丨值丨ISONORAFTER
  2. File类的一些方法测试
  3. 面试美团,面试官突然问我 Java “锁” ,我哭了
  4. 360胡宁:通往CTO的道路上就是四个字
  5. 凯撒密码的实践使用-1
  6. 实现一个本地的json访问地址优化版本--python
  7. java迭代器怎么用_Java中迭代器的使用
  8. 串口驱动程序_实战microPython(09) 串口UART的使用(下)
  9. 在java中如何定义一个方法,个人编程学习网 - Java-方法中的术语和如何定义方法...
  10. linux mc服务器 mod_使用阿里云服务器搭建饥荒联机版服务器(最新有效2020.2.9更新)...