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
self.next=NoneclassSolution:#@param a ListNode
#@return a ListNode
defswapPairs(self, head):if head != None and head.next !=None:
next=head.next
head.next=self.swapPairs(next.next)
next.next=headreturnnextreturn head
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]
tmp.extend(l1)
tmp.extend(l2)return tmp
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
self.next=nextdefget_list_length(head):"""获取链表长度"""length=0whilehead:
length+= 1head=head.nextreturnlengthdefget_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):
cur1=cur1.nextelse:for i in range(length_b -length_a):
cur2=cur2.next
flag=Falsewhile cur1 andcur2:if cur1.value ==cur2.value:print(cur1.value)
flag