while True:
try:
do something
except:
break
while True 必须和break结合,无异常时执行try,异常时执行except,break退出循环。
存在raw_input()和input()两个函数
raw_input()将所有输入作为字符串看待,并且返回字符串类型
input()只用于数字的输入,返回所输入数字类型
只存在input()函数,接收任意类型的输入,并且将输入默认为字符串类型处理,返回字符串类
1)赋值:改变alist,a作相同变化,地址均不变。
2)copy.copy( )浅拷贝: 变量开辟新地址,元素地址不变。
3)copy.deepcopy( )深拷贝:变量和元素都开辟新地址。
单向链表节点的表示:
class Node(object):
'''定义单链表节点类'''
def __init__(self,data,next = None):
'''data为数据项,next为下一节点的链接,初始化节点默认链接为None'''
self.data = data
self.next = next
节点实例化:
# 定义3个节点对象分别为node1、node2和node3
node1 = None
node2 = Node(1,None)
node3 = Node('hello',node2)
print(node1,node2.data,node2,node3.next)
n小于0时,用补码表示:
if n < 0:
n = n & 0xffffffff
注意:python3中, / 返回float,// 返回int
range()是一个函数,用的是括号和逗号。
for i in range(n): #顺着取索引,0~n-1
for i in range(n-1,-1,-1) #倒着取索引,n-1~0
切片是取列表,用的是中括号和冒号。
list = [1, 2, 3, 4, 5, 6, 7 ]
list2[1:5]: [2, 3, 4, 5]
import sys
a=int(sys.stdin.readline().strip())
b=list(map(int,sys.stdin.readline().strip().split()))
c=[]
for i in range(a):
cc=list(map(int,sys.stdin.readline().strip().split()))
c.append(cc)
print(c)
d=[]
while True:
try:
dd=list(map(int,sys.stdin.readline().strip().split()))
if not dd:
break
d.append(dd)
except:
break
print(d)
包含了一个结点,就得包含这个结点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个结点为根的子树。
包含了一个结点,可以只取左子树或者右子树,或者都不取。
DFS:对于树来说,是前序遍历。沿着一条路一直走到底,然后进行回溯
BFS:对于树来说,是层级遍历。优先搜索所有相邻的节点,再访问所有相邻节点的邻节点。
# 定义节点类
class Node(object):
def __init__(self,val,left=None,right=None):
self.val = val
self.left = left
self.right = right
# 创建树模型
node = Node("A",Node("B",Node("D"),Node("E")),Node("C",Node("F"),Node("G")))
def BFS(root):
# 使用列表作为队列,pop(0)
queue = []
# 将首个根节点添加到队列中
queue.append(root)
# 当队列不为空时进行遍历
while queue:
# 从队列头部取出一个节点并判断其是否有左右节点
# 若有子节点则把对应子节点添加到队列中,且优先判断左节点
temp = queue.pop(0)
left = temp.left
right = temp.right
if left:
queue.append(left)
if right:
queue.append(right)
print(temp.val,end=" ")
def DFS(root):
# 使用列表作为栈,pop()
stack = []
# 将首个根节点添加到栈中
stack.append(root)
# 当栈不为空时进行遍历
while stack:
# 从栈的末尾弹出一个节点并判断其是否有左右节点
# 若有子节点则把对应子节点压入栈中,且优先判断右节点
temp = stack.pop()
left = temp.left
right = temp.right
if right:
stack.append(right)
if left:
stack.append(left)
print(temp.val,end=" ")
print("BFS",end=" ")
BFS(node)
print("")
print("DFS",end=" ")
DFS(node)
BFS A B C D E F G
DFS A B D E C F G
# 定义图结构
graph = {
"A": ["B","C"],
"B": ["A", "C", "D"],
"C": ["A", "B", "D","E"],
"D": ["B", "C", "E","F"],
"E": ["C", "D"],
"F": ["D"],
}
def BFS(graph,vertex):
# 使用列表作为队列
queue = []
# 将首个节点添加到队列中
queue.append(vertex)
# 使用集合来存放已访问过的节点
looked = set()
# 将首个节点添加到集合中表示已访问
looked.add(vertex)
# 当队列不为空时进行遍历
while(len(queue)>0):
# 从队列头部取出一个节点并查询该节点的相邻节点
temp = queue.pop(0)
nodes = graph[temp]
# 遍历该节点的所有相邻节点
for w in nodes:
# 判断节点是否存在于已访问集合中,即是否已被访问过
if w not in looked:
# 若未被访问,则添加到队列中,同时添加到已访问集合中,表示已被访问
queue.append(w)
looked.add(w)
print(temp,end=' ')
def DFS(graph,vertex):
# 使用列表作为栈
stack = []
# 将首个元素添加到队列中
stack.append(vertex)
# 使用集合来存放已访问过的节点
looked = set()
# 将首个节点添加到集合中表示已访问
looked.add(vertex)
# 当队列不为空时进行遍历
while len(stack)>0:
# 从栈尾取出一个节点并查询该节点的相邻节点
temp = stack.pop()
nodes = graph[temp]
# 遍历该节点的所有相邻节点
for w in nodes:
# 判断节点是否存在于已访问集合中,即是否已被访问过
if w not in looked:
# 若未被访问,则添加到栈中,同时添加到已访问集合中,表示已被访问
stack.append(w)
looked.add(w)
print(temp,end=' ')
# 由于无向图无根节点,则需要手动传入首个节点,此处以"A"为例
print("BFS",end=" ")
BFS(graph,"A")
print("")
print("DFS",end=" ")
DFS(graph,"A")
BFS A B C D E F
DFS A C E D F B
'''
树的构建:
3
9 20
15 7
'''
class Tree():
'树的构造'
def __init__(self,data, left = 0, right = 0):
self.data = data
self.left = left
self.right = right
def __str__(self):
return str(self.data)
class MyTree():
'二叉树的实现'
def __init__(self,base = 0):
self.base = base
def _Empty(self):
'判断是否为空树'
if self.base == 0:
return True
else:
return False
def front_search(self,tree_base):
'前序遍历:根-左-右'
if tree_base == 0:
return
print(tree_base.data)
self.front_search(tree_base.left)
self.front_search(tree_base.right)
def middle_search(self,tree_base):
'中序遍历:左-根-右'
if tree_base == 0:
return
self.middle_search(tree_base.left)
print(tree_base.data)
self.middle_search(tree_base.right)
def behind_search(self,tree_base):
'后序遍历:左-右-根'
if tree_base == 0:
return
self.behind_search(tree_base.left)
self.behind_search(tree_base.right)
print(tree_base.data)
# test tree
tree1 = Tree(data=15)
tree2 = Tree(data=7)
tree3 = Tree(20,tree1,tree2)
tree4 = Tree(data=9)
base = Tree(3,tree4,tree3)
btree = MyTree(base)
print('前序遍历:')
btree.front_search(btree.base)
print('中序遍历:')
btree.middle_search(btree.base)
print('后序遍历:')
btree.behind_search(btree.base)
add = lambda x, y : x+y
add(1,2) # 结果为3
def quick_sort(list1, start, end):
if start>=end:
return
left=start
right=end
mid=list1[left]
while leftlist1[left]:
left+=1
list1[left],list1[right]=list1[right],list1[left]
mid=list1[left]
quick_sort(list1,left+1,end)
quick_sort(list1,start,left-1)
def merge_sort(lst):
if(len(lst) <= 1):
return lst
left = merge_sort(lst[:len(lst)//2])
right = merge_sort(lst[len(lst)//2:len(lst)])
result = []
while len(left) > 0 and len(right)> 0:
if( left[0] > right[0]):
result.append(right.pop(0))
else:
result.append(left.pop(0))
if(len(left)>0):
result.extend(merge_sort(left))
else:
result.extend(merge_sort(right))
return result
import itertools
class Solution:
def Permutation(self, ss):
# write code here
if not ss:
return []
return sorted(list(set(map(''.join, itertools.permutations(ss)))))
#map(''.join,A) 转化为字符串组成的对象
#set() 返回无重复元素集,降重;可以看作不能重复的集合,也可看做set()对象。
#list() 转化为列表
#sorted() 排序
d={}
numbers=[1,1,2,2,2,3,3,3]
for i in numbers:
try:
dict[i]+=1
except:
dict[i]=1
a={1:2,3:4,5:1}
b=dict(sorted(a.items(),key=lambda b:b[1]))
print(b)
try:
fun()
do something1
expect:
do something2
while True:
try:
a=sys.stdin.readline().strip()
if not a:
break
fun()
except:
break
#sort()改变了a,且不能赋值给b。
a=[1,4,3,2]
a.sort()
print(a)
#sorted()未改变a,改变后的对象赋值给b。
a=[1,4,3,2]
b=sorted(a)
print(a,b)
import collections
d = collections.OrderedDict() #有序字典(输出顺序与添加顺序有关//无序字典无关)
a = collections.Counter(b) #计数器,Counter类型,加dict变成计数字典
在对问题求解时,总是作出在当前看来是最好的选择。(一件事情分为很多步,每步都做最好的选择)(局部最优>>全局最优,必须无后效性)
每次决策依赖于当前状态,又随即引起 ‘状态的转移’。一个‘决策序列’就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。(经分解后得到的子问题往往不是互相独立的,即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)
分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。
类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表或哈希表。具体表现为: 存储位置 = f(key)
一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
#遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。
class Solution:
def IsBalanced_Solution(self, pRoot):
# write code here
if pRoot == None:
return True
if abs(self.TreeDepth(pRoot.left)-self.TreeDepth(pRoot.right)) > 1:
return False
return self.IsBalanced_Solution(pRoot.left) and self.IsBalanced_Solution(pRoot.right)
def TreeDepth(self, pRoot): #计算树的深度
# write code here
if pRoot == None:
return 0
nLeft = self.TreeDepth(pRoot.left) #左子树的深度
nRight = self.TreeDepth(pRoot.right)
return max(nLeft+1,nRight+1)
str.join(sequence)