拼多多4月3号实习生笔试题及解答(python)

4月3号做了拼多多笔试题。先把题目在下面表述出来,方便读者自己尝试。下面说明自己的思路和贴上代码。因为是凭记忆,所以和题目叙述可能不同,但是意思肯定一样。4道题时间统一都是C/C++ 1秒其他2秒

第一题:两两配对差值最小。有n(n为偶数)个数,将之两两配对之后求和,得到的n/2个和中最大值和最小值的差值为value,问value的最小值是多少。输入说明:第一行为数的个数n,第二行为空格隔开的n个数。输出说明:输出最小值

第二题:整数的乘法。有一个数组保存了0-9这10个数字最多可用的次数。另外有两个数A和B,A,B使用的0-9的个数不能超过数组的限制,问A,B乘积最小是多少。输入说明:第一行为数组,第二行为A的位数,第三行为B的位数。输出说明:输出最小乘积。(由于表述可能不太清晰,所以解释一下。如果数组中数x的值为y,那么A,B中加起来最多出现y次的x)

第三题:袜子。有n只袜子,每只袜子有一个代表颜色的数值,早上起来随机拿出两只袜子,如果袜子的颜色之差小于等于d,那么就表示可以组成一双袜子。问组成袜子的概率是多少。输入说明:第一行为代表袜子颜色的数组,第二行为差值d。输出说明:输出6位double型数。

第四题:LeetCode72题原题。此题也无代码。

第一题:两两配对差值最小。有n(n为偶数)个数,将之两两配对之后求和,得到的n/2个和中最大值和最小值的差值为value,问value的最小值是多少。输入说明:第一行为数的个数n,第二行为空格隔开的n个数。输出说明:输出最小值

# -*- coding:utf8 -*-
# 两两配对差值最小
# 思路:将最大与最小配对,次大与次小配对,以此类推。最后求出最大和与最小和的差值即是最小值
n = int(input())
line = input().strip().split()
arr = list(map(int, line))
arr.sort()
adds = [arr[i] + arr[-i-1] for i in range(n//2)]
print(max(adds)-min(adds))

第二题:整数的乘法。有一个数组保存了0-9这10个数字最多可用的次数。另外有两个数A和B,A,B使用的0-9的个数不能超过数组的限制,问A,B乘积最小是多少。输入说明:第一行为数组,第二行为A的位数,第三行为B的位数。输出说明:输出最小乘积。(由于表述可能不太清晰,所以解释一下。如果数组中数x的值为y,那么A,B中加起来最多出现y次的x)

前三题就这题稍微有点难度

# -*- coding:utf8 -*-
# 整数的乘法
# 思路:贪心思想。不妨设lenA<=lenB。将所有0放在A数的最前面。剩下的数从小到大排序后。依次轮流放在A和B的后面。最小的原因自己证明
def mul(nums, na, nb):
    if na <= nums[0]:
        return 0  # 如果A都是0,那么结果一定是0
    number = ''
    for i in range(1, 10):
        number = number + str(i)*nums[i]  # 将数字变为字符串方便在之后加上数字
    a = ''
    na = na - nums[0]  # 将0放在A最前方所以na要减去0的数量
    b = ''
    j = 0
    while na > 0 and nb > 0:  # 将数字依次轮流放在A和B的后面
        a = a + number[j]
        j += 1
        na -= 1
        b = b + number[j]
        j += 1
        nb -= 1
    b = b + number[j:j+nb]  # 剩余数字都放到B后面
    a = int(a)
    b = int(b)
    return a * b

line1 = input().strip().split()
nums = list(map(int, line1))
na = int(input())
nb = int(input())
if na > nb:
    na, nb = nb, na  # 确保na<=nb
res = mul(nums, na, nb)
print(res)

第三题:袜子。有n只袜子,每只袜子有一个代表颜色的数值,早上起来随机拿出两只袜子,如果袜子的颜色之差小于等于d,那么就表示可以组成一双袜子。问组成袜子的概率是多少。输入说明:第一行为代表袜子颜色的数组,第二行为差值d。输出说明:输出6位double型数。

# -*- coding:utf8 -*-
# 袜子
# 概率论的知识,直接暴力法即可
line = input().strip().split()
lens = len(line)
for i in range(lens):
    num = ''
    for j in line[i]:
        if j.isdigit():
            num += j
    line[i] = int(num)
d = int(input())
s = line
# s.sort()
numbers = lens*(lens-1)/2
cnt = 0
for i in range(lens-1):
    for j in range(i, lens):
        if abs(s[i]-s[j]) <= d:
            cnt += 1
res = cnt/numbers
print('%.6f'%res)

 

你可能感兴趣的:(编程,python)