剑指offer之Python实现(一)

面试题四:二维数组的查找

# -*- coding:utf-8 -*-
# array=[[1,2,3],[4,5,6],[7,8,9],[9,10,12]]
# rownum=len(array)
# colnum=len(array[0])
# print(rownum)
# print(colnum)


#思路:这是一个查找过程:首先选取数组中右上角的数字,如果该数字大于要查找的数字,则剔除该数字所在的列;
# 如果该数字小于要查找的数字,则剔除该数字所在的行。
class Solution:
    def Find(self,array,target):


        #判断数组是否为空
        if array==[]:
            return False
        rownum=len(array)#计算行数
        colnum=len(array[0])#计算列数

        i=0
        j=colnum-1
        while i<rownum and  j>=0:#注意这儿用的是逻辑运算and而不是位运算&
            if array[i][j] > target:
                j-=1#剔除列,也就是列数减一
            elif array[i][j] <target:
                i+=1 #剔除行,也就是行数加一
            else:
                return True
        return False#如果找不到,就是False

    def SearchTargetNum(self,matrix,target):#若存在target,计算target的个数
        rows=len(matrix)
        cols=len(matrix[0])

        row=0
        col=cols-1

        count=0
        while row<rows and col>=0:
            if matrix[row][col] >target:
                col-=1
            elif matrix[row][col] <target:
                row+=1
            else:
                count+=1
                col-=1
        return count






array=[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
array2=[]
findtarget=Solution()#创建一个实例
print(findtarget.Find(array,5))
print(findtarget.SearchTargetNum(array,9))
print(findtarget.Find(array2,9))

面试题五:替换空格

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



# S="We are happy."
# L=list(S)
# print(L)

class Solution:#从字符串到列表再到字符串的过程
    def replaceSpace(self,s):
        stringlist=list(s)#把源字符串打散成一个列表
        stringReplace=[]#设置一个空列表,用append方法原地添加
        for item in stringlist:#列表解析
            if item ==' ':#注意引号里要空一格
                stringReplace.append("%20")
            else:
                stringReplace.append(item)
        return "".join(stringReplace)#把列表合成一个字符串

s="We arehappy."
replace=Solution()
print(replace.replaceSpace(s))

面试题六:从尾到头打印链表

# -*- coding:utf-8 -*-
'''
输入一个链表,从尾到头打印链表每个节点的值。
'''
#思路:定义链表节点,
class ListNode:
    def __init__(self,x=None):#值初始化
        self.val=x
        self.next=None

class Solution:
    def PrintListFromTailToHead(self,ListNode):
        if ListNode==None:
            return []#等价于return None
        l=[]
        head=ListNode
        while head:
            l.insert(0,head.val)#始终列表开头插入对象,这样先插入的对象就在后面,后插入的对象就在前面。
            head=head.next
        return l

node1=ListNode(11)
node2=ListNode(20)
node3=ListNode(34)
node1.next=node2
node2.next=node3


SingleNode=ListNode()
s=Solution()
print(s.PrintListFromTailToHead(node1))
print(s.PrintListFromTailToHead(SingleNode))

面试题七:重建二叉树
# -*- coding:utf-8 -*-
#前序遍历:根--左--右      第一个数字就是根节点的值
#中序遍历:左--根--右      在根节点的左边就是左子树的值,在右边就是右子树的值。
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    # 返回构造的TreeNode根节点,pre指的是前序遍历,tin是中序遍历
    def reConstructBinaryTree(self, pre, tin):
        #不写这一行,会报错list index out of range,可能出现了空列表,所以判断如果是空列表,返回None
        if not pre and not tin:
            return None
        #要考虑到只有一个元素的情况。
        if len(pre)==1:
            return TreeNode(pre[0])
        else:
        #根节点就是前序遍历的第一个值,定义一下根节点的值
            root=TreeNode(pre[0])
        #找一下根节点在中序遍历里的索引,
            i=tin.index(pre[0])
        #递归,左子树对应的前序和中序的序列
            root.left=self.reConstructBinaryTree(pre[1:i+1],tin[:i])
        #右子树对应的前序和中序的序列
            root.right=self.reConstructBinaryTree(pre[i+1:],tin[i+1:])

        return  root


pre = [1, 2, 4,7,3,5,6,8]
tin = [4,7,2,1,5,3,8,6]

s = Solution()
newTree = s.reConstructBinaryTree(pre, tin)

面试题九:用两个栈实现队列

# -*- coding:utf-8 -*-
#操作先进后出的栈实现一个先进先出的队列
class Solution:
    def __init__(self):
        self.stack1=[]
        self.stack2=[]
    def push(self, node):
        # 往栈一压入元素
        self.stack1.append(node)

    def pop(self):
        if len(self.stack1)==0 and len(self.stack2)==0:
            return
        #如果栈二为空,把栈一的元素逐个弹出并压入栈二
        elif len(self.stack2)==0:
            while len(self.stack1)>0:
                self.stack2.append(self.stack1.pop())
        return self.stack2.pop()

P = Solution()
P.push(10)
P.push(11)
P.push(12)
print(P.pop())

面试题十:斐波那契数列

# -*- coding:utf-8 -*-
'''
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
n<=39
'''


class Solution:
    def Fibonacci(self, n):
        tempArray = [0, 1]#初始的两值,之后一直更新这两值,后面一项等于前两项之和。
        if n >= 2:
            for i in range(2, n + 1):
                tempArray[i % 2] = tempArray[0] + tempArray[1]
        return tempArray[n % 2]


s=Solution()
print(s.Fibonacci(2))

青蛙跳台阶

# -*- coding:utf-8 -*-
#一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
#从斐波那契数列的第二项开始
#青蛙跳台阶。一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。
#n=1,一种跳法
#n=2,一次跳一个跳两次,一次跳两个跳一次,两种跳法
#n>2,n个台阶,设有f(n)个跳法
#第一次选择跳一个台阶,剩下的n-1个台阶有f(n-1)种跳法;
#第一次选择跳两个台阶,剩下的n-2个台阶有f(n-1)种跳法。
#所以当有n个台阶时,有f(n)=f(n-1)+f(n-2)种跳法。

class Solution:
    def jumpFloor(self, number):
        # write code here
        tempArray=[1,2]
        if number>=3:
            for i in range(3,number+1):
                tempArray[(i+1)%2]=tempArray[0]+tempArray[1]
        return tempArray[(number+1)%2]

s=Solution()
print(s.jumpFloor(2))

青蛙变态跳台阶

# -*- coding:utf-8 -*-
#一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。f(n)=2^(n-1)
#青蛙变态跳台阶。
#n=1,一种跳法
#n=2,一次跳一个跳两次,一次跳两个跳一次,两种跳法
#n>2,n个台阶,设有f(n)个跳法
#第一次选择跳一个台阶,剩下的n-1个台阶有f(n-1)种跳法;
#第一次选择跳两个台阶,剩下的n-2个台阶有f(n-1)种跳法。
#第一次选择跳三个台阶,剩下的n-3个台阶有f(n-3)种跳法。
#……
#第一次选择跳n个台阶,有1种跳法。
#所以当有n个台阶时,有f(n)=f(n-1)+f(n-2)+f(n-3)+……+f(1)种跳法。
#f(n-1)=f(n-2)+f(n-3)+f(1)
#两式相减,f(n)=2f(n-1)=2^2f(n-2)=……=2^(n-1)f(1)
class Solution:
    def jumpFloorII(self, number):
        # write code here
        ans=1
        if number>=2:
            for i in range(number-1):#for i in range(n)循环n次
                ans=ans*2
        return ans


s=Solution()
print(s.jumpFloorII(2))

矩形覆盖

# -*- coding:utf-8 -*-
#我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
#将2*n的覆盖方法记为f(n)。
#用第一个2*1的矩形去覆盖大矩形的最左边时有两种选择:横着放和竖着放。
#横着放的时候,左下角必须横着放2*1小矩形,右边还剩下2*(n-2)的区域,有f(n-2)种覆盖方法;
#竖着放的时候,右边还剩下2*(n-1)的区域,有f(n-1)种覆盖方法。
#所以f(n)=f(n-1)+f(n-2)
class Solution:
    def rectCover(self, number):
        # write code here
        #考虑矩形不存在的情况
        if number==0:
            return 0
        tempArray=[1,2]
        if number>=3:
            for i in range(3,number+1):
                tempArray[(i+1)%2]=tempArray[0]+tempArray[1]
        return tempArray[(number+1)%2]

未完待续。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值