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)

打印结果:

扫描二维码关注公众号,回复: 2999136 查看本文章
请输入一个数: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 层,到此整个函数才算执行结束,然后打印:程序结束

猜你喜欢

转载自blog.csdn.net/geek_xiong/article/details/82287218
今日推荐