热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【剑指Offer】110题

1二维数组中的查找1.1题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照

1 二维数组中的查找

1.1 题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

1.2 解题思路

按行开始遍历,假设target大于第一行的最后一个数,那么我们就在第二行查找;如果target小于一行的最后一个数,那么我们检查下倒数第二列是否等于target。

1.3 解题代码

# -*- coding:utf-8 -*-
class Solution:# array 二维列表def Find(self, target, array):# write code hererows,cols=len(array),len(array[0])-1row=0while row=0:if array[row][cols]==target:return Trueelif array[row][cols]>target:cols=cols-1else:row=row+1return False

2 替换空格

2.1 题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

2.2 解题思路

  • replace
  • 遍历字符串,然后遇到空格就替换成“%20”

2.3 解题代码

  • 思路1

# -*- coding:utf-8 -*-
class Solution:# s 源字符串def replaceSpace(self, s):# write code herereturn s.replace(" ","%20")

  • 思路2

# -*- coding:utf-8 -*-
class Solution:# s 源字符串def replaceSpace(self, s):# write code herenews=""for c in s:if c==' ':news+="%20"else:news+=creturn news

3 从尾到头打印链表

3.1 题目描述

输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

3.2 解题思路

遍历列表,每次遍历一个节点,然后将当前节点的值添加到列表,然后更新节点为下一个节点,最后将列表反转。

3.3 解题代码

# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:# 返回从尾部到头部的列表值序列,例如[1,2,3]def printListFromTailToHead(self, listNode):# write code heredata=[]while listNode:data.append(listNode.val)listNode=listNode.nextreturn data[::-1]

4 重建二叉树

4.1 题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

4.2 解题思路

首先我们先回顾下前中后三种遍历顺序:

  • 前序遍历:根结点 ---> 左子树 ---> 右子树
  • 中序遍历:左子树---> 根结点 ---> 右子树
  • 后序遍历:左子树 ---> 右子树 ---> 根结点

然后发现前序的第一个节点肯定为根节点,在中序遍历中,在根节点左边的为左子树的中序遍历,在根节点右边的为右子树的中序遍历;那么在左子树的节点中,我们可以在前序遍历中找到左子树的根节点,右子树同理。

4.3 解题代码

# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:# 返回构造的TreeNode根节点def reConstructBinaryTree(self, pre, tin):# write code hereif not pre or not tin:return Noneroot=TreeNode(pre[0])val=tin.index(pre[0])root.left=self.reConstructBinaryTree(pre[1:val+1],tin[:val])root.right=self.reConstructBinaryTree(pre[val+1:],tin[val+1:])return root

5 用两个栈实现队列

5.1 题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

5.2 解题思路

我感觉这个题的主要考查的是:栈的出入站栈顺序是先进后出,队列的出入队列顺序是先进新出,那么元素压入一个栈(负责入栈),然后再弹入到另一个栈(负责出栈),那么就可以实现队列了。


1531909-e4ed52840514e8b9.png

5.3 解题代码

# -*- coding:utf-8 -*-
class Solution:def __init__(self):self.stackA=[]self.stackB=[]def push(self, node):# write code hereself.stackA.append(node)def pop(self):# return xxif self.stackB:return self.stackB.pop()if not self.stackA:return Noneelse:while self.stackA:self.stackB.append(self.stackA.pop())return self.stackB.pop()

6 旋转数组的最小数字

6.1 题目描述

6.2 解题思路

我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都是大于或者等于后面子数组的元素。我们还注意到最小的元素刚好是这两个子数组的分界线。在排序的数组中我们可以利用二分查找来实现O(logn)的查找。本题给出的数组在一定程度上是排序的,因此我们可以试着用二分查找的思路来寻找这个最小的元素。

以前面的例子为例,我们先把第一个指针指向第0个元素,把第二个指针指向第4个元素,如图所示。位于两个指针中间(在数组的下标是2)的数字是5,它大于第一个指针指向的数字。因此中间数字5一定位于第一个递增字数组中,并且最小的数字一定位于它的后面。因此我们可以移动第一个指针让它指向数组的中间。

此时位于这两个指针中间的数字为1,它小于第二个指针指向的数字。因此这个中间数字为1一定位于第二个递增子数组中,并且最小的数字一定位于它的前面或者它自己就是最小的数字。因此我们可以移动第二个指针指向两个指针中间的元素即下标为3的元素。

此时两个指针的距离为1,表明第一个指针已经指向了第一个递增子数组的末尾,而第二个指针指向第二个递增子数组的开头。第二个子数组的第一个数字就是最小的数字,因此第二个指针指向的数字就是我们查找的结果。

1531909-35a9c021621a6821.png

上述方法是否就一定够完美了呢?面试官会告诉你其实不然。他将提示我们再仔细分析小标leftIndex和rightIndex分别和途中P1和P2相对应)的两个数相同的情况。在前面,当着两个数相同,并且它们中间的数相同的也相同时,我们把IndexMid赋给了leftIndex,也就是认为此时最小的数字位于中间数字的后面。是不是一定一样?

我们再来看一个例子。数组{1,0,1,1,1}和数组{1,1,1,0,1}都可以堪称递增排序数组{0,1,1,1,1}的旋转,图2分别画出它们由最小数字分隔开的两个子数组。

1531909-cf0f3d64f8264901.png

这两种情况中,第一个指针和第二个指针指向的数字都是1,并且两个指针中间的数字也是1,这3个数字相同。在第一种情况中,中间数字(下标为2)位于后面是子数组;在第二种情况中,中间数字(下标为2)位于前面的子数组中。因此,当两个指针指向的数字及它们中间的数字三者相同的时候,我们无法判断中间的数字是位于前面的子数组中还是后面的子数组中国,也无法移动两个指针来缩小查找的范围。此时,我们不得不采用顺序查找的方法。

原文:https://blog.csdn.net/jsqfengbao/article/details/47108069

6.3 解题代码

# -*- coding:utf-8 -*-
class Solution:def minNumberInRotateArray(self, rotateArray):# write code hereif not rotateArray:return 0front, rear &#61; 0, len(rotateArray) - 1midIndex &#61; 0while rotateArray[front] >&#61; rotateArray[rear]:if rear - front &#61;&#61; 1:midIndex &#61; rearbreakmidIndex &#61; (front &#43; rear) // 2if rotateArray[front] &#61;&#61; rotateArray[midIndex] and rotateArray[front] &#61;&#61; rotateArray[rear]:return self.minOrder(rotateArray, front, rear)if rotateArray[front] <&#61; rotateArray[midIndex]:front &#61; midIndexelif rotateArray[rear] >&#61; rotateArray[midIndex]:rear &#61; midIndexreturn rotateArray[midIndex]def minOrder(self, array, front, end):result &#61; array[0]for i in array[front:end &#43; 1]:if i

7 斐波那契数列

7.1 题目描述

大家都知道斐波那契数列&#xff0c;现在要求输入一个整数n&#xff0c;请你输出斐波那契数列的第n项&#xff08;从0开始&#xff0c;第0项为0&#xff09;。
n<&#61;39

7.2 解题思路

在数学上&#xff0c;费波那契数列是以递归的方法来定义&#xff1a;


1531909-a0022ee98be6a895.png

理解原理后&#xff0c;我们直接遍历即可

7.3 解题代码

# -*- coding:utf-8 -*-
class Solution:def Fibonacci(self, n):# write code hereres&#61;[0,1]while len(res)<&#61;n:res.append(res[-1]&#43;res[-2])return res[n]

8 跳台阶

8.1 题目描述

一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法&#xff08;先后次序不同算不同的结果&#xff09;。

8.2 解题思路

利用动态规划&#xff0c;dp[n]为我们存放结果的列表。
假设n&#61;1&#xff0c;那么只有一种跳法&#xff0c;dp[1]&#61;1
假设n&#61;2&#xff0c;可以跳2级或者跳两个1级&#xff0c;dp[2]&#61;2
假设n&#61;3&#xff0c;可以跳三个1级&#xff0c;一个2级一个1级或者一个1级一个2级&#xff0c;dp[3]&#61;3
....
那么假设n&#61;9&#xff0c;我们可以发现只要我们我们知道n&#61;7和n&#61;8时&#xff0c;就可以确定到第九级的跳法。因为我们可以从第7级直接跳到第9级&#xff0c;或者从第8级直接跳到第9级。
所以状态转移公式如下&#xff1a;
dp[n]&#61;dp[n-1]&#43;dp[n-2]

8.3 解题代码

# -*- coding:utf-8 -*-
class Solution:def jumpFloor(self, number):# write code heredp&#61;[1,2]while len(dp)<&#61;number:dp.append(dp[-1]&#43;dp[-2])return dp[number-1]

9 变态跳台阶

9.1 题目描述

一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

9.2 解题思路

分析&#xff1a;用Fib(n)表示青蛙跳上n阶台阶的跳法数&#xff0c;青蛙一次性跳上n阶台阶的跳法数1(n阶跳)&#xff0c;设定Fib(0) &#61; 1&#xff1b;
当n &#61; 1 时&#xff0c; 只有一种跳法&#xff0c;即1阶跳&#xff1a;Fib(1) &#61; 1;
当n &#61; 2 时&#xff0c; 有两种跳的方式&#xff0c;一阶跳和二阶跳&#xff1a;Fib(2) &#61; Fib(1) &#43; Fib(0) &#61; 2;
当n &#61; 3 时&#xff0c;有三种跳的方式&#xff0c;第一次跳出一阶后&#xff0c;后面还有Fib(3-1)中跳法&#xff1b; 第一次跳出二阶后&#xff0c;后面还有Fib(3-2)中跳法&#xff1b;第一次跳出三阶后&#xff0c;后面还有Fib(3-3)中跳法
Fib(3) &#61; Fib(2) &#43; Fib(1)&#43;Fib(0)&#61;4;
当n &#61; n 时&#xff0c;共有n种跳的方式&#xff0c;第一次跳出一阶后&#xff0c;后面还有Fib(n-1)中跳法&#xff1b; 第一次跳出二阶后&#xff0c;后面还有Fib(n-2)中跳法..........................第一次跳出n阶后&#xff0c;后面还有 Fib(n-n)中跳法.
Fib(n) &#61; Fib(n-1)&#43;Fib(n-2)&#43;Fib(n-3)&#43;..........&#43;Fib(n-n)&#61;Fib(0)&#43;Fib(1)&#43;Fib(2)&#43;.......&#43;Fib(n-1)
又因为Fib(n-1)&#61;Fib(0)&#43;Fib(1)&#43;Fib(2)&#43;.......&#43;Fib(n-2)
两式相减得&#xff1a;Fib(n)-Fib(n-1)&#61;Fib(n-1) &#61;&#61;&#61;&#61;&#61;》 Fib(n) &#61; 2*Fib(n-1) n >&#61; 2
递归等式如下&#xff1a;


1531909-e82f2cd758e21283.png

原文&#xff1a;https://blog.csdn.net/Hackbuteer1/article/details/6686747

9.3 解题代码

# -*- coding:utf-8 -*-
class Solution:def jumpFloorII(self, number):# write code heredp&#61;[1,1]if number>1:while len(dp)<&#61;number:dp.append(dp[-1]*2)return dp[number]

10 矩形覆盖

10.1 题目描述

我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形&#xff0c;总共有多少种方法&#xff1f;

10.2 解题思路

n&#61;1 - 只有横放一个矩形一种解决办法
n&#61;2 - 有横放一个矩形&#xff0c;竖放两个矩形两种解决办法
n&#61;3 - n&#61;2的基础上加1个横向&#xff0c;n&#61;1的基础上加2个竖向
n&#61;4 - n&#61;3的基础上加1个横向&#xff0c;n&#61;2的基础上加2个竖向
...
n&#61;n - n &#61; f(n-1) &#43; f(n-2)

10.3 解题代码

# -*- coding:utf-8 -*-
class Solution:def rectCover(self, number):# write code here# if number&#61;&#61;0:# return 0# elif number&#61;&#61;1:# return 1# elif number&#61;&#61;2:# return 2# return self.rectCover(number-1)&#43;self.rectCover(number-2)dp&#61;[0,1,2]if number>2:while len(dp)<&#61;number:dp.append(dp[-1]&#43;dp[-2])return dp[number]


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
author-avatar
你的美我chase
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有