剑指offer的Python实现(一)

1. 二维数组的查找:

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

class Solution:

    # array 二维列表

    def Find(self, target, array):

        # write code here

        rows = len(array) - 1

        cols = len(array[0]) - 1

        i = rows

        j = 0

        while j <= cols and i >= 0:

            if target < array[i][j]:

                i -= 1

            elif target > array[i][j]:

                j += 1

            else:

                return True

        return False

(1)题目是判断数组中是否有该整数,只用返回True ,False, 看清楚题目

题目思路:找数组的右上角或者左下角的数与目标整数做比较,这样可以划掉一整行或一整列,减小搜索范围。

(2)先得出数组的行数和列数

(3)while循环

<1>很重要:找边界

<2> if 语句中的写得很巧

2.替换空格:

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

(1)

class Solution:

    # s 源字符串

    def replaceSpace(self, s):

        return "%20".join(list(s.split(" ")))

join()函数

语法:  'sep'.join(seq)

参数说明 sep:分隔符。可以为空 seq:要连接的元素序列、字符串、元组、字典 上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串

返回值:返回一个以分隔符sep连接各个元素后生成的字符串

(2)

class Solution:

    # s 源字符串

    def replaceSpace(self, s):

        return s.replace(' ', '%20')

replace()方法语法

str.replace(old, new[, max])

参数

old -- 将被替换的子字符串。

new -- 新字符串,用于替换old子字符串。

max -- 可选字符串, 替换不超过 max 次

 

(3)

先得出字符串的总长度,和字符串中的空格符的个数,从而可以得出替换后的新字符串的长度,【然后用两个指针(用字符串下标表示p,q)分别指向原字符串的最后一位和新字符串的最后一位,从后往前复制,碰到空格符,则去做替换】【这个过程也是要先过个边界,从后往前,p>0,q>p

 

3.从尾到头打印链表

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

要考虑面试官是否允许修改链表,从而能不能直接修改指针方向

不希望打印时修改链表,肯定是要遍历链表,遍历顺序是从头到尾,输出却是从尾到头,典型的后进先出,用栈合适。可以写出一种算法。

而递归本质上就是一个栈结构,所以本题可以用递归来实现。每访问一个结点的时候,先递归输出它后边的结点,再输出结点自身,这样链表的输出结果就反过来了。

递归

# -*- coding:utf-8 -*-

# class ListNode:

#     def __init__(self, x):

#         self.val = x

#         self.next = None

class Solution:

# 返回从尾部到头部的列表值序列,例如[1,2,3]

    def printListFromTailToHead(self, listNode):

    # write code here

        if listNode is None:

            return []

        return self.printListFromTailToHead(listNode.next) + [listNode.val]

 

4.重建二叉树

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

 

# -*- 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 here

        if not pre or not tin:

            return None

        root = TreeNode(pre.pop(0))

        index = tin.index(root.val)

        root.left = self.reConstructBinaryTree(pre, tin[:index])

        root.right = self.reConstructBinaryTree(pre, tin[index + 1:])

        return root

递归要用self.函数名()

 

python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍

代码中经常会有变量是否为None的判断,有三种主要的写法:

第一种是`if x is None`;

第二种是 `if not x:`;

第三种是`if not x is None`(这句这样理解更清晰`if not (x is None)`) 。

如果你觉得这样写没啥区别,那么你可就要小心了,这里面有一个坑。先来看一下代码:

>>> x = 1

>>> not x

False

>>> x = [1]

>>> not x

False

>>> x = 0

>>> not x

True

>>> x = [0] # You don't want to fall in this one.

>>> not x

False

 

在python中 None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()都相当于False

因此在使用列表的时候,如果你想区分x==[]和x==None两种情况的话, 此时`if not x:`将会出现问题。

结论:

`if x is not None`是最好的写法,清晰,不会出现错误,以后坚持使用这种写法。

使用if not x这种写法的前提是:必须清楚x等于None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()时对你的判断没有影响才行。

 

python中的not具体表示是什么,举个例子说一下

在python中not是逻辑判断词,用于布尔型True和False,not True为False,not False为True,以下是几个常用的not的用法:

(1) not与逻辑判断句if连用,代表not后面的表达式为False的时候,执行冒号后面的语句。比如:

a = False

if not a: (这里因为a是False,所以not a就是True)

print "hello"

这里就能够输出结果hello

(2) 判断元素是否在列表或者字典中,if a not in b,a是元素,b是列表或字典,这句话的意思是如果a不在列表b中,那么就执行冒号后面的语句,比如:

a = 5

b = [1, 2, 3]

if a not in b:

print "hello"

这里也能够输出结果hello

not x 意思相当于 if x is false, then True, else False

5.用两个栈实现队列

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

# -*- coding:utf-8 -*-

class Solution:

    def __init__(self):

        self.stack1 = []

        self.stack2 = []        

    def push(self, node):

        # write code here

        if len(self.stack1) == 0:

            while len(self.stack2):

                self.stack1.append(self.stack2.pop())

        self.stack1.append(node)

        

    def pop(self):

        # return xx

        if not len(self.stack2) == 0:

            return self.stack2.pop()

        else:

            while len(self.stack1) > 1:

                self.stack2.append(self.stack1.pop())

            return self.stack1.pop()

 

python 中_init_函数以及参数self

1)class类包含:

 

类的属性:类中所涉及的变量

类的方法:类中函数

 

2)_init_函数(方法)

 

1.首先说一下,带有两个下划线开头的函数是声明该属性为私有,不能在类地外部被使用或直接访问。

2.init函数(方法)支持带参数的类的初始化 ,也可为声明该类的属性

3.init函数(方法)的第一个参数必须是 self(self为习惯用法,也可以用别的名字),后续参数则可 以自由指定,和定义函数没有任何区别。

 

3)函数定义

Python编程中对于某些需要重复调用的程序,可以使用函数进行定义,基本形式为:

def 函数名(参数1, 参数2, ……, 参数N): 其代码形式如下面所示:

def function_name (parameters):

  block

  return value

注意在类的内部,使用def关键字可以为类定义一个函数(方法),与一般函数定义不同,类方法必须包含参数self,且为第一个参数!

此外,可使用 **kw定义关键参数,代表任意参数,python函数可变参数及关键字参数定义参考见下文。

python函数只能先定义再调用!

4)self参数含义

在类的代码(函数)中,需要访问当前的实例中的变量和函数的,即,访问Instance中的:

对应的变量(property):Instance.ProperyNam,去读取之前的值和写入新的值

调用对应函数(function):Instance.function(),即执行对应的动作

此处的Instance本身就是self。

Python中的self等价于C++中的self指针和Java、C#中的this参数

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值