python后端面试题(1)

填空题

  1. (1+3+5+7+……+95+97+99) x (1-3+5-7+……+97-99) = ( )
    其实这题手算也可以算出来的
    (1+3+5+7+……+95+97+99) = 100 x 25 = 2500
    (1-3+5-7+……+97-99)= -2x25 = -50
    所以结果就是2500x(-50) = -125000
    但我们手算出来有点太LOW了, 还是用代码来实现吧
In [1]: a = [i for i in range(100) if i % 2 == 1]

In [2]: a
Out[2]:
[1,
 3,
 5,
...
 95,
 97,
 99]

In [3]: sum(a)
Out[3]: 2500

In [4]: sum(a[::2]) - sum(a[1::2])
Out[4]: -50

In [5]: 2500 * (-50)
Out[5]: -125000

  1. 在已经排好列的有128个元素的整数数组中二分查找一个数, 需要查找的次数最多不超过( log128) 次
  2. 已知一棵二叉树, 如果前序遍历的节点顺序是:ADCEFGHB, 中序遍历是:CDFEGHAB,则后序排列的结果为是( CFHEDBA)

参考https://blog.csdn.net/qq_33243189/article/details/80222629
本题主要考察二叉树的前中后序的推导, 前序的规则是根->左节点->右节点, 中序的规则是: 左节点->根节点->右节点, 后序的规则是:左节点->右节点-根节点

推算逻辑如下:
第一步:
前序第一个是A,说明A是根节点
中序中A后面只有一个B, 说明B是A的右节点
				         A
				              B
第二步:
前序第二个是D, 说明D是A的左节点
中序第一个是C, 说明C是左节点且后面没有左节点, 第二个是D, 说明C应该是D的左节点,这里初始验证下: 前序应该是ADCB, 中序应该是CDAB, 是符合要求的
						A
					D		B
				C
第三步:
前序中的第四个是E, 后面是FG,而在中序中E前是F, 所以E是D的右节点,F是E的左节点,G是E的右节点, , 
						A
            		D   	 B
				C   	E
			          F    G
这里再次验证:前序应该是ADCEFGB  中序应该是:CDFEGAB   也是符合要求的
第四步: 
最后只剩下H了, 前序和中序中,H都在G后面, H应该是G的右节点,
 						A
            		D   	 B
				C   	E
			          F    G
			                 H
所以根据后序的读取规则, CFHGEDBA

纯个人意见,若有考虑不周的地方,敬请指出, 相互进步.
  1. 要爬十级台阶,一次可以爬一级, 也可以爬两级, 也可以爬三级,总共( 274 )种爬法
    别人的解决方案参考
    我自己写的解决方案:
  2. (10100001)2 和(1111010)2是两个二进制数,两数之和的十进制表示法为( )

这题考察的应该是二进制相加运算以及十进制与二进制的转换,

  1. 样本数据为3,6, a, 4, 2的均值是5,则这样本方差是()

代码阅读题(直接在IDE中将结果运行出来了)

  1. 考察的是list倒序切片, 去重, list合并相关基础知识
In [1]: list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]

In [2]: list2 = [9, 8, 7, 21, 13, 5, 2, 0]

In [3]: sum(set(list1[-7:-2] + list2))
Out[3]: 78  
  1. 考察函数
In [1]: def g(n):
   ...:     for i in range(2, n):
   ...:         if n % i == 0:
   ...:             return False
   ...:     return True
   ...:
# 这个函数是用来判断一个数字是否是素数的
In [3]: sum([x for x in range(1, 30) if g(x)])
Out[3]: 130  

In [4]: [x for x in range(1, 30) if g(n)]
Out[4]: [1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
  1. 考察的是全局变量与局部变量
x = {'val': 1}
y = {'val': 2}
z = {'val': 3}

def f(obj1, obj2):
    obj1 = {'val': 3}
    obj2['val'] = 4
    z = {'val': obj1['val'] + obj2['val']}

f(x, y)

print(x['val'])    # 1
print(y['val'])    # 4 
print(z['val'])    # 3
  1. 考察浅复制与深复制的区别
In [1]: import copy

In [2]: a = [1, 2, 3, 4, 5, ['a', 'b', 'c']]

In [3]: b = a

In [4]: c = copy.copy(a)

In [5]: d = copy.deepcopy(a)

In [6]: a.append(5)

In [7]: a[5].append('d')

In [8]: b   # b 这一步容易理解,其实就是对象的引用(别名)
Out[8]: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 5]

In [9]: c  # c只拷贝父对象,不会拷贝对象的内部的子对象
Out[9]: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd']]

In [10]: d   # d 这一步也容易理解,完全拷贝了父对象及其子对象
Out[10]: [1, 2, 3, 4, 5, ['a', 'b', 'c']]
  1. 考察类的继承与重载

class Parent(object):
    x = 1


class Child1(Parent):
    pass


class Child2(Parent):
    pass


Child1.x = 2
print(Parent.x, Child1.x, Child2.x)  # 1 2 1

Parent.x = 3
print(Parent.x, Child1.x, Child2.x)   # 3 2 3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值