华为OD机试真题2024(Python/C-D/100分/11-20)

11.查找接口成功率最优时间段

思路:循环记录符合条件的元素,以及将记录转换为输出要求的格式。

难度:⭐⭐⭐

n = int(input())
arr = list(map(int, input().split()))

minsum = 0
temp = []
cnt = 1
dic1 = {}
dic1_cnt = 0

# 创建字典,把符合条件的元素记录下来
for i in range(len(arr)):
    minsum += arr[i]
    minarg = minsum/(cnt)
    if minarg <= n:
        temp.append(i)
        cnt += 1
        dic1[dic1_cnt] = temp
    else:
        minsum = 0
        cnt = 1
        temp=[]
        dic1_cnt += 1

# 读取字典,转换为所需格式
if len(dic1.values()) > 0:
    output = ''
    for i in dic1.values():
        if len(i) > 1:
            output = '-'.join((str(i[0]),str(i[-1])))
        else:
            output = str(i[0])
        print(output, end=' ')
else:
    print('NULL')

12.分割均衡字符串

思路:分别为X和Y都设定计数器以表示其数量,当数量一致时总数加一,XY计数器重置。

难度:⭐✨

arr = input()

# 设定三个计数器
cnt_x = 0
cnt_y = 0
cnt_sum = 0
for i in arr:
    if i == 'X':
        cnt_x += 1
    if i == 'Y':
        cnt_y += 1

    # 当X的数量和Y的数量达到相同时,总计数器加一,X和Y的计数器重置
    if cnt_x == cnt_y:
        cnt_x = 0
        cnt_y = 0
        cnt_sum += 1

print(cnt_sum)

13.虚拟游戏理财

思路:通过将所有符合要求的单个产品和两个产品对应的投资汇报作比较,找到对应的产品号(可能是一个也可能是两个,也可能没有),将产品号按要求进行输出格式转换。

难度:⭐⭐✨

n, money_sum, risk_sum = map(int, input().split())
backrate = list(map(int, input().split()))
risk = list(map(int, input().split()))
maxmoney = list(map(int, input().split()))

# 创建一个数组,用于放置投资汇报以及其产品号
backmoney = []
for i in range(n):
    # 如果只有一个产品符合要求
    if maxmoney[i] <= money_sum and risk[i] <= risk_sum:
        temp = maxmoney[i] * backrate[i]
        backmoney.append([temp, i])
    # 如果有两个产品符合要求
    for j in range(i + 1, n):
        if maxmoney[i] + maxmoney[j] <= money_sum and risk[i] + risk[j] <= risk_sum:
            temp = maxmoney[i] * backrate[i] + maxmoney[j] * backrate[j]
            backmoney.append([temp, [i, j]])

# 找出最大的投资回报,并找出其对应的产品号
backmoney.sort(key=lambda x: x[0], reverse=True)
max_num = backmoney[0][1]
# 输出格式转换
result = []
for i in range(len(maxmoney)):
    if i in max_num:
        result.append(maxmoney[i])
    else:
        result.append(0)
print(' '.join(str(x) for x in result))

14.靠谱的车

思路:题目要求跳过4,所以可以设定一个计数器,如果当前的循环数包含“4”,那么跳过,如果不包含“4”,那么计数器加一。

难度:⭐✨

n = int(input())

cnt = 0
for i in range(1, n + 1):
    # 此处要让i转换为str格式才能使用.count()函数
    if not str(i).count('4'):
        cnt += 1

print(cnt)

15.执行时长

思路:一次处理时间可以处理其最大处理能力之内的任务数,那么在每次循环中,要判断当前的任务数需要多少次处理时间,并把剩余的任务数留到下一次继续处理。

难度:⭐⭐

import math
n = int(input())
l = int(input())
arr = list(map(int, input().split()))

# 初始化计数器以及余数
cnt_time = 0
last = 0
for i in arr:
    # 如果上一次剩余的任务数和本次的任务数在处理能力之内,那么需要一次处理时间
    if last + i <= n:
        cnt_time += 1
        last = 0
    # 如果上一次剩余的任务数和本次的任务数超出处理能力,那么需要最大处理能力计算处理时间,并把不需要用一次最大处理能力的任务数留到下一次
    else:
        cnt_time += (last + i) // n
        last = (last + i) % n

# 如果结束后仍有剩余任务未处理,那么最后一次性处理,这里需要向上取整,用math.ceil()函数
if last > 0:
    cnt_time += math.ceil(last/n)

print(cnt_time)

16.万能字符单词拼写

思路:当前判别的单词,如果字符一样那么字符串需要需要去除这个字符,并且问号也需要考虑进去。当这个单词判别完毕后,下一个单词需要重新对字符串去除字符,所以字符串不能直接去除元素,而是每一次需要复制一个新的字符串用于判别。

难度:⭐⭐⭐

n = int(input())
char_arr = []
for i in range(n):
    char_arr.append(input())

target_arr = input()
wenhao = target_arr.count('?')

cnt = 0
cnt_sum = 0
# 由于每次都需要在target_arr上删除元素,但是又不能改变target_arr,所以复制一个r用于判别
arr_copy = target_arr
for x in char_arr:
    for y in x:
        if y in arr_copy:
            cnt += 1
            # 如果有同样的元素,那么将复制的target_arr中的对应元素删除一个
            arr_copy = arr_copy.replace(y,'',1)
    # 问号凑数作为判别
    if cnt + wenhao >= len(x):
        cnt_sum += 1
    # 当上一个单词判别完毕后,重新复制一个target_arr
    arr_copy = target_arr
    cnt = 0

print(cnt_sum)

17.来自异国的客人

思路:进制转换,就这题而言求出转换后的数组再统计其幸运数即可。但是进制转换求出的数组需要逆顺序才是正解。

难度:⭐⭐

k, n, m = map(int, input().split())

# 求余求商
arr = []
while k >= m:
    ys = k % m
    k = k // m
    arr.append(ys)

print(arr)
# arr反顺序即为k的m进制表示
arr_reverse = []
for i in range(len(arr)):
    arr_reverse.append(arr[-1-i])

# 计数
cnt = 0
for i in arr_reverse:
    if i == n:
        cnt += 1
print(cnt)

18.求最多可以派出多少支团队

思路:首先需要将符合条件的单个元素筛选出去,并计数。然后排序后设定前后两个指针,由于是从小到大排序,所以后面的数更大,当两个指针指向的数符合条件,两个指针往中间靠拢,否则,前指针前进去指向更大的数继续判别。

难度:⭐⭐✨

n = int(input())
arr = list(map(int, input().split()))
low = int(input())

# 使用过滤函数,把单个能力不符合要求的筛选下来,筛选出去的个数=新数组长度-旧数组长度
arr_1 = list(filter(lambda x:x<low,arr))
cnt = len(arr) - len(arr_1)

# 将数组从小到大排序后,设定两个指针,前后指向数组进行判别,当前指针和后指针汇合时,循环结束
arr_1.sort()
begin = 0
end = len(arr_1)-1
while begin < end:
    # 符合要求的,前指针前进,后指针后退,计数
    if arr_1[begin] + arr_1[end] >= low:
        begin += 1
        end -= 1
        cnt += 1
    # 不符合要求的,前指针前进,后指针不动,不计数
    else:
        begin += 1

print(cnt)

19.最长子字符串的长度

思路:根据'o'的个数进行统计

难度:⭐

s = input()
cnt = s.count('o')
if cnt%2 == 0:
    print(len(s))
else:
    print(len(s)-1)

20.机场航班调度程序

思路:这里主要将航空公司缩写和航班信息不进行拆分,直接对其进行排序。当然可以使用字典、类等方式排序,也可以将内容拆分,在排序时直接选定已拆分内容。

难度:⭐⭐

arr = list(input().split(','))
# 排序,首先对航空公司缩写排序,其次对航班信息排序
arr.sort(key=lambda x:(x[:2],x[2:]))
print(','.join(x for x in arr))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值