剑指offer部分题目及答案 python完成
1、 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
答:
class Solution:# array 二维列表def Find(self, target, array):# write code heren=len(array)flag='false'for i in range(n):if target in array[i]:flag='true';breakreturn flag
while True:try:S=Solution()# 字符串转为listL=list(eval(raw_input()))array=L[1]target=L[0]print(S.Find(target, array))except:break
len(list) 长度 二维数组就是2.
raw_input() 将所有输入作为字符串看待,返回字符串类型
注意:input() 和 raw_input() 这两个函数均能接收 字符串 ,但 raw_input() 直接读取控制台的输入(任何类型的输入它都可以接收)。而对于 input() ,它希望能够读取一个合法的 python 表达式,即你输入字符串的时候必须使用引号将它括起来,否则它会引发一个 SyntaxError 。
除非对 input() 有特别需要,否则一般情况下我们都是推荐使用 raw_input() 来与用户交互。
注意:python3 里 input() 默认接收到的是 str 类型。
https://www.runoob.com/python/python-func-input.html
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
https://www.runoob.com/python/python-func-eval.html
2、请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
答:
class Solution:# s 源字符串def replaceSpace(self, s):# write code heres = list(s)l=len(s)for i in range(0,l):if s[i]==' ':s[i]='%20'return ''.join(s)
if __name__=='__main__':a="we are happy "s=Solution()b=s.replaceSpace(a)print(b)
Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
https://www.runoob.com/python/att-string-join.html
3、输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
class Solution:# 返回从尾部到头部的列表值序列,例如[1,2,3]def printListFromTailToHead(self, listNode):# write code herel = []head = listNodewhile head:l.insert(0, head.val)head = head.nextreturn l
listNode表示链表第一个节点的地址
val表示节点值
next表示下一个节点
4、https://blog.csdn.net/zhhy236400/article/details/105739946
5、用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
答:
栈A用来作入队列
栈B用来出队列,当栈B为空时,栈A全部出栈到栈B,栈B再出栈(即出队列)
class Solution:def __init__(self):self.stack1=[]self.stack2=[]def push(self, node):# write code hereself.stack1.append(node)def pop(self):# return xxif self.stack2==[]:while self.stack1:self.stack2.append(self.stack1.pop())return self.stack2.pop()
6、把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
答:笨方法,逐个比较,当前元素大于下一个元素时,表明下一个元素是最小元素。
class Solution:def minNumberInRotateArray(self, rotateArray):# write code hereif len(rotateArray) == 0:return 0if len(rotateArray) == 1:return rotateArray[0]for i in range(len(rotateArray)-1):if rotateArray[i] > rotateArray[i+1]:res = rotateArray[i+1]breakreturn res
7、大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39
答:递归调用开销大,复杂度高。
使用列表保存每个元素:
import time
class Solution:def Fibonacci(self, n):# write code heres = [0,1]if n < 2:return s[n]for i in range(2,n+1):a = s[i-1] + s[i-2]s.append(a)return s[n]
if __name__ == '__main__':s=Solution()a=time.time()print(s.Fibonacci(35))b=time.time()print(b-a)
耗时可以忽略不计。
8、一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
答:比较倾向于找规律的解法,f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5, 可以总结出f(n) = f(n-1) + f(n-2)的规律,但是为什么会出现这样的规律呢?假设现在6个台阶,我们可以从第5跳一步到6,这样的话有多少种方案跳到5就有多少种方案跳到6,另外我们也可以从4跳两步跳到6,跳到4有多少种方案的话,就有多少种方案跳到6,其他的不能从3跳到6什么的啦,所以最后就是f(6) = f(5) + f(4);这样子也很好理解变态跳台阶的问题了。
本质是斐波那契数列:
class Solution:def jumpFloor(self, number):# write code heres=[0,1,2]if number<=2:return s[number]else:for i in range(3,number+1):a=s[i-1]+s[i-2]s.append(a)return s[number]
if __name__ == '__main__':s=Solution()res=s.jumpFloor(10)print(res)
更简洁的做法:
class Solution:def jumpFloor(self, number):# write code herea = 1b = 1for i in range(number):a,b = b,a+breturn a
n=1时,a=1,b=2
n=2时,a=2,b=3
n=3时,a=3,b=5
所以,a的值就是斐波那契数列。
9、一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
答:
f(1) = 1
f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。
f(3) = f(3-1) + f(3-2) + f(3-3)
。。。
f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(n-(n-1)) + f(n-n)
f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)
f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1) = f(n-1) + f(n-1)
所以:
class Solution:def jumpFloorII(self, number):# write code hereif number <= 0:return 0else:return pow(2,number-1)
或者:
class Solution:def jumpFloorII(self, number):# write code hereif number <= 0:return 0if number==1:return 1else:return 2*self.jumpFloorII(number-1)
10、我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
答:本质是斐波那契数列,只用考虑把最后一块矩形是如何放置的。
f(n) = f(n-1) + f(n-2)
class Solution:def rectCover(self, number):# write code heres=[0,1,2]if number <=2:return s[number]for i in range(3,number+1):a=s[i-1]+s[i-2]s.append(a)return s[number]
11、输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
答:补码看不懂。
class Solution:def NumberOf1(self, n):# write code herereturn sum([(n>>i & 1) for i in range(0,32)])
另给定整数的二进制右移操作,移位后和1的二进制作与运算,1相当于哨位,用来检测每一位是0还是1.
为什么range(0,32),这里没看懂。
也可以改成:将1左移操作,但是要除以(1<<i),因为左移会将1变大。
return sum([(n&1<<i)/(1<<i) for i in range(0,32)])
12、输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
答:
遍历两次 第一次取出奇数,第二次偶数。
class Solution:def reOrderArray(self, array):# write code herenew=[]for i in array:if i%2==1:new.append(i)for i in array:if i%2==0:new.append(i)return new
13、输入一个链表,输出该链表中倒数第k个结点。
答:用一个列表存储链表的值。
class ListNode:def __init__(self, x):self.val = xself.next = Noneclass Solution:def FindKthToTail(self, head, k):# write code herel=[]while head!=None:l.append(head)head=head.nextif k>len(l) or k<1:returnreturn l[-k]
快慢指针:快指针和慢指针相差K个节点,快指针移动到末尾时,慢指针就是倒数第K个节点。
class Solution:def FindKthToTail(self, head, k):# write code hereslow,fast=head,headfor i in range(k):if not fast:return Nonefast=fast.nextwhile fast:slow=slow.nextfast=fast.nextreturn slow
14、输入一个链表,反转链表后,输出新链表的表头。
答:
class Solution:# 返回ListNodedef ReverseList(self, pHead):# write code hereif not pHead or not pHead.next:return pHeadpre = Nonewhile pHead:nex=pHead.nextpHead.next=prepre=pHeadpHead=nexreturn pre
输入[1,2,3,4,5],输出[5,4,3,2,1]
https://blog.csdn.net/dhRainer/article/details/83411645
15、输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
答:
class Solution:# 返回合并后列表def Merge(self, pHead1, pHead2):# write code hereres = head = ListNode(42) #42这个值可以随便取while pHead1 and pHead2:if pHead1.val < pHead2.val:head.next = pHead1pHead1 = pHead1.nextelse:head.next = pHead2pHead2 = pHead2.nexthead = head.nexthead.next = pHead1 or pHead2return res.next #因为这里有next
16、操作给定的二叉树,将其变换为源二叉树的镜像。
答:
class Solution:# 返回镜像树的根节点def Mirror(self, root):# write code hereif root!= None:root.left,root.right = root.right,root.leftself.Mirror(root.left)self.Mirror(root.right)
以上为剑指offer部分题目,代码从牛客网评论区摘抄。
剑指offer部分题目及答案 python完成相关推荐
- 剑指offer有python版吗_剑指Offer算法类题目[Python版]
标签:重复 作用 coding 面试 medium mba none fas utf-8 面试题012 数值的整数次方 解题思路1 考虑所有情况,循环连乘 代码: de ...
- 剑指offer 矩阵中的路径 @python
剑指offer 矩阵中的路径 @python 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...
- 销量过亿的《剑指0ffer》题目和答案电子书 (附下载)
如果有人问面试前该看哪些题,有什么书籍可以推荐,那么<剑指offer>一定必读不可,这本书书豆瓣评分高达 9.0 ,非常适合集中时间阅读.电子书下载 1.扫码关注「顶级架构师」订阅号 2. ...
- 《剑指offer》面试题的Python实现
所属网站分类: 面试经典 > python 作者:gg 链接: http://www.pythonheidong.com/blog/article/464/ 来源:python黑洞网 www.p ...
- 《剑指offer》题目说明
剑指offer推荐刷题地址: Leetcode: https://leetcode-cn.com/problemset/lcof (官方授权) 牛客网:https://www.nowcoder.com ...
- 《剑指 Offer》题目汇总
文章目录 1. 数组 2. 链表 3. 栈和队列 4. 哈希表 5. 字符串 6. 树 7. 堆 8. 回溯和深度优先搜索 9. 递归和循环 10. 双指针 11. 动态规划 12. 贪心算法 13. ...
- 《剑指Offer》题目:树的子结构
题目描述:树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目分析:此题可以拆成两题,1.在二叉树中查找是否存在某个结点:2.判断两个二叉树是否 ...
- 【剑指offer】题目二
//实现一个函数:把字符串中的每个空格替换成"%20".例如输入"We are happy."则输出"We%20are%20happy." ...
- 《剑指Offer》题目:合并两个排序的链表
题目描述:输入两个单调递增的链表list1,list2,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析: 1.对于链表题目,首先考虑边界情况,即链表为空的情况,提升代码 ...
- 剑指offer的题目
1. 变态跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析 跳一个n阶台阶的方法数: 先跳一级,剩下的n-1级有f ...
最新文章
- 汇编语言ac和c何时为1,汇编语言课堂练习一(参考答案)
- 【转】Android studio安装与配置
- new ArrayList 报错
- 【开通指南】 实时计算 Flink 全托管版本
- 关于table的那些用法(一)
- python中引号_Python中单引号,双引号和三引号的区别
- (71)Verilog HDL时间度量系统函数:$time
- Vue的基本环境搭建
- python连接sql server
- 矩池云上安装及使用Milvus教程
- Separate texture from black background
- mysql查看和修改密码策略
- the permanent HWaddr of eth0 .. is still in use by bond0
- 计算机模拟水循环的过程,袋装水模拟做科学小实验水循环(步骤图解)
- python 字符串转字典的几种方法
- jdk1.8 在綫英文+有道翻譯版
- 运维快速入门必备的 Linux 服务器安全简明指南,速收!
- 观察者模式与推拉模型
- 可编程计算器(phoc)的设计与实现
- 内地人去香港旅游注意事项