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

53、找出数组中重复的数

在这里插入图片描述
用o(n)的方法解决:
题目里写了数组里数字的范围保证在0 ~ n-1 之间,所以可以利用现有数组设置标志,当一个数字被访问过后,可以设置对应位上的数 + n,之后再遇到相同的数时,会发现对应位上的数已经大于等于n了,那么直接返回这个数即可。
在这里插入图片描述

54、构建成绩数组,不能用除法

在这里插入图片描述
对输入的数组,算出来一个正向的累乘的同样长度的数组。在算一个逆向的累乘数组,逆向的只乘到数组第二位,后面接个1达到和输入相同长度, 然后把逆向的第一个直接赋值出来,剩下的斜着和正向的乘,画个图就清楚了
输入【1,2,3,4】 正向【1,2,6,24】 逆向【24,12,4,1】 输出【24,12,8,6】
在这里插入图片描述

55、链表中环的入口

非常简单,快慢指针,先判断有没有环,有的话,让快慢相遇,此时慢回到表头,以快慢指针以相同速度走,相遇的点就是入口
在这里插入图片描述

56、之字型打印二叉树

用两个栈实现,一个存奇数行 一个存偶数行,遍历偶数行时,先添加左子树再添加右子树,当遍历奇数行栈时,反之
在这里插入图片描述

57、删除链表中重复的数

注意用一个 常量保存重复节点的值
还有就是 last轻易不更新,只有后面两个都不同情况才更新
在这里插入图片描述

58、判断二叉树镜像

仔细看注释,不能没递归到头就轻易return true
在这里插入图片描述

59、二叉树的第k节点

在这里插入图片描述

60、一句话判断是否为2的幂

我们知道2的n次方的二进制只有最高位是1,其余为0,减1后最高位向后借位为0,其余为1。因此将原来的数与减去1后的数字进行与运算后会发现为零。
在这里插入图片描述

61、有序数组,和为sum的两个数

在这里插入图片描述

62、n对合法的括号对

在这里插入图片描述
在这里插入图片描述

63、字符串编辑距离

只能删除、插入、替换三种操作,使s1变为s2

状态转移方程是这样的:dp[i][j]表示word1[0…i-1]到word2[0…j-1]的编辑距离
而dp[i][0]显然等于i,因为只需要做i次删除操作就可以了。同理dp[0][i]也是如此,等于i,因为只需做i次插入操作就可以了。在这里插入图片描述
只要对应位置不相等
dp[i][j]=min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1])+1 #三种情况都需要操作一次,只需要初始化好就行了
在这里插入图片描述

64、最小的k个数

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,
(同理可以引申到求最小k个数 快排思想)
在这里插入图片描述

65、不用二分法求sqrt

用牛顿迭代法
在这里插入图片描述
x = x-f(x)/df(x) 化简完就是x = (x+target/x)/2

在这里插入图片描述

66、回文子字符串个数

在这里插入图片描述
方法:从字符串某一位置开始,尝试扩展子字符串
在这里插入图片描述

67、 字符串循环移位包含

在这里插入图片描述

68、字符串循环移位

s = “abcd123” k = 3
Return “123abcd”
将字符串向右循环移动 k 位。

将 abcd123 中的 abcd 和 123 单独翻转,得到 dcba321,然后对整个字符串进行翻转,得到 123abcd。

69、一组字符可以组成的最长的回文串的长度

Input : “abccccdd”
Output : 7
Explanation : One longest palindrome that can be built is “dccaccd”, whose length is 7.
使用长度为 256 的整型数组来统计每个字符出现的个数,每个字符有偶数个可以用来构成回文字符串。

因为回文字符串最中间的那个字符可以单独出现,所以如果有单独的字符就把它放到最中间。

70、字符串同构

Given “egg”, “add”, return true.
Given “foo”, “bar”, return false.
Given “paper”, “title”, return true.

方法:记录每一个字符第一次出现的位置
def isIsomorphic( s,t:):
return list(map(s.find,s))==list(map(t.find,t))

71.最多几个不重叠区间

Input: [[1,2],[2,3],[3,4],[1,3]]
Output: 3 ([1,2],[2,3],[3,4])
在这里插入图片描述

72.多个有序数组,找出topk个数

在这里插入图片描述

73.n个数的全排列

思路介绍:举个例子,比如你要对a,b,c三个字符进行全排列,那么它的全排列有abc,acb,bac,bca,cba,cab这六种可能,你们想想你们是如何得出这六种可能的。没错!就是当指针指向第一个元素a时,它可以是其本身a(即和自己进行交换),还可以和b,c进行交换,故有3种可能,当第一个元素a确定以后,指针移向第二位置,第二个位置可以和其本身b及其后的元素c进行交换,又可以形成两种排列,当指针指向第三个元素c的时候,这个时候其后没有元素了,此时,则确定了一组排列,输出。但是每次输出后要把数组恢复为原来的样子。

在这里插入图片描述

74.删除多余的空格,只保留一个

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值