python编程⽼师⾯试题_python⾯试题五:Python编程
1.B Tree和B+ Tree的区别?
1.B树中同⼀键值不会出现多次,并且有可能出现在叶结点,也有可能出现在⾮叶结点中。
⽽B+树的键⼀定会出现在叶结点中,并有可能在⾮叶结点中重复出现,以维持B+树的平衡。2.因为B树键位置不定,且在整个树结构中只出现⼀次,
2.请列举常见排序并通过代码实现任意三种。
3.请列举常见查并通过代码实现任意三种。
4.台阶问题/斐波那契
⼀只青蛙⼀次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上⼀个n级的台阶总共有多少种跳法。
defmemo(func):
cache={}def wrap(*args):if args not incache:
cache[args]= func(*args)returncache[args]returnwrap
@memodeffib(i):if i < 2:return 1
return fib(i-1) + fib(i-2)
5.变态台阶问题
⼀只青蛙⼀次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上⼀个n级的台阶总共有多少种跳法。
fib = lambda n: n if n < 2 else 2 * fib(n - 1)
6.矩形覆盖
我们可以⽤2*1的⼩矩形横着或者竖着去覆盖更⼤的矩形。请问⽤n个2*1的⼩矩形⽆重叠地覆盖⼀个2*n的⼤矩形,总共有多少种⽅法?
第2*n个矩形的覆盖⽅法等于第2*(n-1)加上第2*(n-2)的⽅法。
f = lambda n: 1 if n < 2 else f(n - 1) + f(n - 2)
7.杨⽒矩阵查
在⼀个m⾏n列⼆维数组中,每⼀⾏都按照从左到右递增的顺序排序,每⼀列都按照从上到下递增的顺序排序。请完成⼀个函数,输⼊这样的⼀个⼆维数组和⼀个整数,判断数组中是否含有该整数。
defget_value(l, r, c):returnl[r][c]deffind(l, x):
m= len(l) - 1n= len(l[0]) - 1r=0
c=nwhile c >= 0 and r <=m:
value=get_value(l, r, c)if value ==x:returnTrueelif value >x:
c= c - 1
elif value
r= r + 1
return False
8.去除列表中的重复元素
list(set(l))
l1 = ['b','c','d','b','c','a','a']
l2=[]
[l2.append(i)for i in l1 if not i in l2]
9.链表成对调换
1->2->3->4转换成2->1->4->3.
classListNode:def __init__(self, x):
self.val=x
<=NoneclassSolution:#@param a ListNode
#@return a ListNode
defswapPairs(self, head):if head != None !=None:
<=self.)
<=headreturnnextreturn head
python获取数组长度10.创建字典的⽅法
items=[('name','earth'),('port','80')]
dict2=dict(items)
dict1=dict((['name','earth'],['port','80']))
11.合并两个有序列表
循环算法
思路:
定义⼀个新的空列表
⽐较两个列表的⾸个元素
⼩的就插⼊到新列表⾥
把已经插⼊新列表的元素从旧列表删除
直到两个旧列表有⼀个为空
再把旧列表加到新列表后⾯
defloop_merge_sort(l1, l2):
tmp=[]while len(l1) > 0 and len(l2) >0:if l1[0]
tmp.append(l1[0])dell1[0]else:
tmp.append(l2[0])dell2[0]
pop弹出
a = [1,2,3,7]
b= [3,4,5]defmerge_sortedlist(a,b):
c=[]while a andb:if a[0] >=b[0]:
c.append(b.pop(0))else:
c.append(a.pop(0))whilea:
c.append(a.pop(0))whileb:
c.append(b.pop(0))returncprint merge_sortedlist(a,b)
#第三种⽅法
defmerge(a, b):
c=[]
h= j =0while j < len(a) and h
c.append(a[j])
j+= 1
else:
c.append(b[h])
h+= 1
if j ==len(a):for i inb[h:]:
c.append(i)else:for i ina[j:]:
c.append(i)return c
12.交叉链表求交点
其实思想可以按照从尾开始⽐较两个链表,如果相交,则从尾开始必然⼀致,只要从尾开始⽐较,直⾄不⼀致的地⽅即为交叉点,如图所⽰
另外⼀种⽐较正规的⽅法,构造链表类
classNode(object):def __init__(self, value=None, next=None):
self.value=value
<=nextdefget_list_length(head):"""获取链表长度"""length=0whilehead:
length+= turnlengthdefget_intersect_node(list_a, list_b):"""查链表第⼀个交叉结
点"""length_a=get_list_length(list_a)
length_b=get_list_length(list_b)
cur1, cur2=list_a, list_bif length_a >length_b:for i in range(length_a -length_b):
lse:for i in range(length_b -length_a):
flag=Falsewhile cur1 andcur2:if cur1.value ==cur2.value:print(cur1.value)
flag=Truebreak
else:
if notflag:print('链表没有交叉结点')if __name__ == '__main__':
list_a= Node('a1', Node('a2', Node('c1', Node('c2', Node('c3'))))) #构造不带头结点的链表:a1→a2→c1→c2→c3
list_b = Node('b1', Node('b2', Node('b3', Node('c1', Node('c2', Node('c3')))))) #构造不带头结点的链表:b1→b2→b3→c1→c2→c3 get_intersect_node(list_a, list_b)
13.⼆分查
#coding:utf-8
defbinary_search(list, item):
low=0
high= len(list) - 1
while low <=high:
mid= (high - low) / 2 + low #避免(high + low) / 2溢出
guess =list[mid]if guess >item:
high= mid - 1
elif guess
low= mid + 1
else:returnmidreturnNone
mylist= [1,3,5,7,9]print binary_search(mylist, 3)
14.快排
#coding:utf-8
defquicksort(list):if len(list)<2:returnlistelse:
midpivot=list[0]
lessbeforemidpivot= [i for i in list[1:] if i<=midpivot]
biggerafterpivot= [i for i in list[1:] if i >midpivot]
finallylist= quicksort(lessbeforemidpivot)+
[midpivot]+quicksort(biggerafterpivot)returnfinallylistprint(quicksort([2,4,6,7,1,2,5]))
15.零问题
#coding:utf-8#values是硬币的⾯值values = [ 25, 21, 10, 5, 1]#valuesCounts 钱币对应的种类数#money 出来的总钱数
#coinsUsed 对应于⽬前钱币总数i所使⽤的硬币数⽬
defcoinChange(values,valuesCounts,money,coinsUsed):#遍历出从1到money所有的钱数可能
for cents in range(1,money+1):
minCoins=cents#把所有的硬币⾯值遍历出来和钱数做对⽐
for kind inrange(0,valuesCounts):if (values[kind] <=cents):
temp= coinsUsed[cents - values[kind]] +1
if (temp
minCoins=temp
coinsUsed[cents]=minCoinsprint ('⾯值:{0}的最少硬币使⽤数为:{1}'.format(cents, coinsUsed[cents]))
16.⼴度遍历和深度遍历⼆叉树
17.⼆叉树节点
classNode(object):def __init__(self, data, left=None, right=None):
self.data=data
self.left=left
self.right=right
tree= Node(1, Node(3, Node(7, Node(0)), Node(6)), Node(2, Node(5), Node(4)))
18.图的⼴度优先遍历
importQueuedefbfs(adj, start):
visited=set()
q=Queue.Queue()
q.put(start)pty():
()print(u)for (u, []):if v not invisited:
visited.add(v)
q.put(v)
graph= {1: [4, 2], 2: [3, 4], 3: [4], 4: [5]}
bfs(graph,1)
19.图的深度优先遍历
def dfs(adj, start):
visited = set()
stack = [[start, 0]]
while stack:
(v, next_child_idx) = stack[-1]
if (v not in adj) or (next_child_idx >= len(adj[v])):
stack.pop()
continue
next_child = adj[v][next_child_idx]
stack[-1][1] += 1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论