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.用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为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参数