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

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.交叉链表求交点

其实思想可以按照从尾开始比较两个链表,如果相交,则从尾开始必然一致,只要从尾开始比较,直至不一致的地方即为交叉点,如图所示

1275415-20200128141000591-1662720996.png

另外一种比较正规的方法,构造链表类

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值