python3 面试题_Python3面试题1

这篇文章只讲解一个面试题,题目如下:

有两个序列 a, b,大小都是 n (即序列的长度为 n ),序列元素的值为任意整数型,无序;

要求:通过交换 a, b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差值最小。

1)将两个序列合并成一个新的序列,并从小到大排序,为Source

2)拿出最大的元素用big绑定,次大的元素用small绑定

3)在余下的序列进行平分,分别得到max,min

4)将small加到max序列,将big加到min序列上,重新计算新序列的和,和大的为max,和小的为min。

以上为面试原题,其中1-4为解题过程,可按此过程来分析、化解题目

1. 首先肯定要有两个序列(我们在这使用列表list)a=[…] ,b=[…]

2. 将两个序列合并为一个新写序列 c = a + b

3. 为新序列排序 c.sort()

4. …

首先我们按要求提供两个随机的列表:

from random import sample

a = sample(range(1,100),5)

b = sample(range(1,100),5)

print('a=', a)

print('b=', b)

运行结果:(以下结果都是随机的,每次都不一定,所以结果只做参考)

a= [62, 83, 33, 26, 41]

b= [28, 53, 89, 51, 85]

再把两个列表合并成一个新的列表,并为这个新的列表从小到大排序:

from random import sample

a = sample(range(1, 100), 5)

b = sample(range(1, 100), 5)

print('a=', a)

print('b=', b)

# ----------------

L = a + b

L.sort()

print('Source=', L)

此时打印结果看一下:

a= [8, 14, 62, 68, 27]

b= [64, 29, 9, 32, 71]

Source= [8, 9, 14, 27, 29, 32, 62, 64, 68, 71]

在这我们已经完成了第一步,也算前提工作处理阶段吧,下边的才是重点

剩下的我们写一个函数来实现,否则会很麻烦,至于为什么使用函数,一会就知道了

from random import sample

def mylist(L):

# 第二步,拿出最大的数与次大的数

big = L[-1]

small = L[-2]

print(big)

print(small)

a = sample(range(1, 100), 5)

b = sample(range(1, 100), 5)

L = a + b

L.sort()

print('Source=', L)

mylist(L) # 调用上边写的函数

打印结果欣赏一番:

Source=[6, 14, 34, 40, 54, 59, 63, 67, 77, 89]

89

77

第三步、第四步一起完成

from random import sample

def mylist(L):

if not L:

return ([],[])

big = L[-1]

small = L[-2]

_max, _min = mylist(L[:-2]) # 第三步

_max.append(small) # append 是将small元素添加到_max序列中

_min.append(big)

_max_sum = sum(_max) # 求和

_min_sum = sum(_min)

if _max_sum > _min_sum: # 返回序列

return _max, _min

else:

return _min, _max

def get_random(n):

'''生成n个随机数'''

return sample(range(1, 100), n)

n = int(input('请输入一个数:'))

a = get_random(n)

b = get_random(n)

L = a + b

L.sort()

print('Source=', L)

L1, L2 = mylist(L) # 接收返回的序列

print('L1=', L1)

print('L2=', L2)

打印结果:

请输入一个数:3

Source= [29, 34, 40, 47, 61, 64]

L1= [34, 40, 64]

L2= [29, 47, 61]

请输入一个数:5

Source= [5, 6, 20, 55, 62, 64, 74, 81, 82, 99]

L1= [5, 55, 62, 74, 82]

L2= [6, 20, 64, 81, 99]

_max, _min = mylist(L[:-2]) # 第三步 这一条用的是函数的递归,重复的调用函数自身,达到我们想要的结果,否则就要长篇大论了。

顺便写一个递归函数执行过程解释

def fx(n):

print('进入第{}层'.format(n))

if n == 3:

return

fx(n + 1)

print('退出第{}层'.format(n))

fx(1)

print('程序结束')

先看执行结果:

进入第1层

进入第2层

进入第3层

退出第2层

退出第1层

程序结束

图片是这个程序的执行过程

第一次正常执行时,先打印:进入第 1 层,然后遇到了递归函数,

第二次执行本身的函数,打印:进入第 2 层,然后又遇到了递归函数,

第三次执行本身的函数,打印:进入第 3 层,但是n==3条件满足了,直接return,

注意这个return是返回上一层递归函数,因为上一层还没有执行完呢,就直接又调用自身了,此时打印:退出第 2 层,到这第 2 层递归完了,但是第 1 层还没完呢,再继续打印:退出第 1 层,到此整个函数才算执行结束,然后打印:程序结束

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值