python数据结构面试题_Python经典面试题与参考答案集锦

一些面试题

1.列表的遍历问题(0507)

list_1 = [10, 20, 30, 40, 50]

# 不能对一个列表同时进行 遍历 和 增删元素

for element in list_1:

print(element)

if element == 30 or element == 40:

list_1.remove(element)

print(list_1)

# 改进

temp_list = list()

# 先遍历列表,记录下需要增删的元素

for element in list_1:

print(element)

if element == 30 or element == 40:

temp_list.append(element)

# 遍历完列表,再对需要增删的内容进行逐一处理

for element in temp_list:

list_1.remove(element)

print(list_1)

2.字典排序 (0530)

# 题目1

# 按照score的值进行排序。

list_a = [

{"name": "p1", "score": 100},

{"name": "p2", "score": 10},

{"name": "p3", "score": 30},

{"name": "p4", "score": 40},

{"name": "p5", "score": 60},

]

print(sorted(list_a, key=lambda a: a["score"], reverse=False))

# 题目2

# 一行代码 通过filter 和 lambda 函数输出以下列表索引为奇数的对应的元素

list_b = [12, 232, 22, 2, 2, 3, 22, 22, 32]

方法一:

new_list=[x[1] for x in fliter(lambdy x:x[0]%2==1,enumerate(list_b))]

方法二:

for index, element in enumerate(list_b):

print("") if index % 2 == 0 else print(element)

3.给定三个整数 a, b, c 求和 ,求和之前需要删除里面相同的整数

示例:

loneSum(1, 2, 3) -> 6

loneSum(3, 2, 3) -> 2

loneSum(3, 3, 3) -> 0

loneSum1 = (1, 2, 3)

loneSum2 = (3, 2, 3)

loneSum3 = (3, 3, 3)

counter = int()

for element in loneSum1:

if loneSum1.count(element) == 1:

counter += element

print(counter)

4.给出一个字符串,找出头尾的镜像字符串,即从头正序,从尾倒叙相同的字符串;

示例:

mirrorEnds("abXYZba") -> "ab"

mirrorEnds("abca") -> "a"

mirrorEnds("aba") -> "aba"

def main(source_str):

reverse_str = source_str[::-1]

for i in range(len(source_str)):

if reverse_str[:(i+1)] != source_str[:(i+1)]:

return source_str[:i]

if reverse_str == source_str:

return source_str

if __name__ == '__main__':

print(main(mirrorEnds))

5.给定一个整数系列 N1, N2…;以及整数M, M是整数系列中的最大数; 从整数系列中取三个数, 可以重复取,要求三个数的和为M。 求所有的可能结果, 并剔除具有相同的结果,得到排序不同的结果。

示例:数列N: [1, 3, 5, 7, 9, 11, 13, 15], 和 M 为17, 返回结果是

[1, 1, 15], [1, 3, 13], [1, 5, 11], [1, 7, 9], [3, 3, 11], [3, 5, 9], [3, 7, 7], [5, 5, 7]

num_list = [1, 3, 5, 7, 9, 11, 13, 15]

M = 17

for i in range(len(num_list)):

for j in range(i, len(num_list)):

for k in range(j, len(num_list)):

if num_list[i] + num_list[j] + num_list[k] == M:

print((num_list[i], num_list[j], num_list[k]))

6.MRO继承的问题

求三次输出的 Parent.x, Child1.x, Child2.x 分别是多少?

lass Parent(object):

x = 1

class Child1(Parent):

pass

class Child2(Parent):

pass

print(Parent.x, Child1.x, Child2.x)

Child1.x = 2

print(Parent.x, Child1.x, Child2.x)

Parent.x = 3

print(Parent.x, Child1.x, Child2.x)

# 提示:print(Child1.__mro__)

#答案:1,1,1 1,2,1 3,2,3

7.参数传递的问题

第一题

class Counter():

def __init__(self, count=0):

self.count = count

def main():

c = Counter()

c.name = "zhangsan"

times = 0

for i in range(10):

increment(c, times)

print("count is {0}".format(c.count))

print("times is {0}".format(times))

def increment(c, times):

times += 1

c.count += 1

if __name__ == "__main__":

main()

#答案:

# count is 10

# times is 0

第二题

class Count(object):

def __init__(self, count=0):

self.count = count

def main():

c = Count()

n = 1

m(c, n)

print("count is {0}".format(c.count))

print("n is {0}".format(n))

def m(c, n):

c = Count(5)

n = 3

if __name__ == '__main__':

main()

#答案:

# count is 0

# n is 1

8.装饰器/闭包面试题(0615)

def outFun(a):

def inFun(x):

return a * x

return inFun

flist1 = [outFun(a) for a in range(3)]

for func in flist1:

print(func(1))

# fist2 = [lambda x:a*x for a in range(3)]

flist2 = [lambda x:a*x for a in range(4)]

for func in flist2:

print(func(2))

# 答案: 0 1 2, 6 6 6 6

9.字典排序题(zrc)

s = [{1: "a"}, {3: "c"}, {2: "b"}]

请按照字母acsii码排序

print(sorted(s, key = lambda x: tuple(x.values())[0]))

print(sorted(s, key = lambda x: list(x.values())[0]))

sorted 语法:

sorted(iterable[, cmp[, key[, reverse]]])

参数说明:

iterable -- 可迭代对象。

cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。

key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

返回重新排序的列表。

10.冒泡排序题(zrc)

def sor():

li=[{1:"b"},{3:"c"},{2:"a"}]

for i in range(len(li)):

for j in range(len(li) - i - 1):

v1 = [value for value in list(li[j].values())][0]

v2 = [value for value in list(li[j+1].values())][0]

print(v1,v2)

if v1 > v2:

li[j],li[j+1] = li[j+1],li[j]

return li

ret = sor()

print(ret)

11.二分法查找(zrc)

def bin_search(data_set, value):

low = 0; high = len(data_set) - 1

while True:

mid = (low + high) // 2

if data_set[mid] > value:

high = mid - 1

elif data_set[mid] < value:

low = mid + 1

else:

a = b = mid

while data_set[a] == value and a >= 0:

a -= 1

while data_set[b] == value and b < len(data_set) - 1:

b += 1

return (a+1, b)

ret = bin_search([8,8,8,8], 8)

print(ret)

12.a=[1,2,3,4,5,6],打印出所有以偶数为key,奇数为值的字典

print({key: value for key, value in zip([i for i in a if i % 2 == 0], [i for i in a if i % 2 != 0])})

13.写一个函数实现阶乘

def factorial(num):

counter = 1

for i in range(1, num+1):

counter *= i

return counter

print(factorial(5))

14.有字符串a=‘hsfbsadgasdgvnhhhadhaskdhwqhcjasd’,求出现次数最多的前四个

第一种解法:

def search(a):

# 省略校验逻辑

# 生成包含 element 和 count 数据的集合

data_set = {(element, count) for element, count in zip(a, [a.count(i) for i in a])}

print(data_set)

# 转换成列表类型,进行倒序排序

data_list = list(data_set)

new_data_list = sorted(data_list, key=lambda x: x[1], reverse=True)

# 取出前四名

new_data_list = new_data_list[0:4]

# 拼接字符串

return "".join([i[0] for i in new_data_list])

print(search(a))

第二种简单解法:

a = 'hsfbsadgasdgvnhhhadhaskdhwqhcjasd'

# 导入Counter模块

from collections import Counter

# 创建对象

count = Counter(a)

# 获取出现频率最高的四个字符

print(count.most_common(4))

# 输出:[('h', 7), ('s', 5), ('a', 5), ('d', 5)]

15.sorted排序

if other_allocated_amount:

data_list.append({

"shop_id": 0,

"shop_name": "其他",

"destination": 2,

"current_storage": 0,

"demand_amount": 0,

"allocated_amount": other_allocated_amount,

"priority": 0,

"negative_order": 0

})

# 按优先级排序

data_list = sorted(data_list, key=lambda d: d["priority"], reverse=True)

shop_order = {"仓库": -999, "总部": 1, "刘园": 2, "侯台": 3,

"咸水沽": 4, "华明": 5,

"大港": 6, "杨村": 7, "新立": 8, "大寺": 9, "汉沽": 10,

"沧州": 11, "静海": 13, "芦台": 14, "工农村": 15, "唐山": 16, "廊坊": 17,

"哈尔滨": 18, "西青道": 19, "双鸭山": 20, "承德": 21,

"张胖子": 22, "固安": 23, "燕郊": 24, "胜芳": 25, "蓟县": 26, }

data_list = sorted(data_list, key=lambda d: shop_order.get(d["shop_name"], 999))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值