华为机试【2022-02-20真题】已考完三题通过率90%、84%、79%
第一题:计算出租车的实际里程
出租车司机自行修改了里程表,导致每次遇到4,就会跳过,比如4-->5、39-->40、400-->500
输入描述:里程表的显示里程
输出描述:里程表的实际里程
例1:
输入:
5
输出:
4
解释:因为实际里程到4之后,会跳过直接到5,所以里程表显示5的时候,实际里程应该为4
例2:
输入:
15
输出:
13
解释:实际里程到4之后,会跳过直接到5,多了1,到14之后直接跳到了15,又多了1,所以 13 = 15 - 1 - 1
n = int(input())
m = 0
more = 0
while m < n:
# 不知道4会出现在个、十、百、千、万哪儿个位置
if '4' in str(m):
this_m = int(str(m).replace("4", "5"))
if this_m <= n:
more += this_m - m
m = this_m
else:
break
else:
m += 1
print(n-more)
# 此答案用例通过率90%,执行时间超时了
第二题:求数组中最大N个与与最小N个数的和
输入一个输入和N,求求数组中最大N个与与最小N个数的和,数组需要去重,去重后的输入长度如果不够2*N,则返回 -1
输入描述:
数组个数
按空格分割的数组
N的值
例1:
输入描述:
5
95 88 83 64 100
2
输出:
342
解释:最大的两个数是:100、95 最小的两个数是:83、64,输出他们的和即可
a = int(input())
b = [int(x) for x in input().split(" ")]
b = list(set(b))
b.sort()
c = int(input)
max_n = []
min_n = []
if len(b) < c*2:
print(-1)
else:
max_n = b[-c:]
min_n = b[:c]
print(sum(max_n) + sum(min_n))
# 此答案用例通过率84%,占用内存超过了限定值
第三题:求最长子串长度
输入一个字符串,求符合条件的最长子串的长度,符合条件的子串必须且只能包含一个字母(a-zA-Z),其余部分只能由数字构成
例如:
输入:
abc123ABC
输出:
4
解释:最长的连续数字长度为123,随便加上前面或者后面的一个字母,长度即为:4
import re
s = input()
# 通过正则找出所有连续的数字子串(考完之后想了下,其实不如改成双指针遍历的方法去找最长数字子串)
pattern = re.compile(r'\d+')
arr = pattern.findall(s)
if not arr:
print(-1)
else:
max_n = arr[0]
for i in arr:
if len(i) > len(max_n):
max_n = i
index_start = s.index(max_n)
if index_start - 1 >= 0 and s[index_start-1] in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ":
print(len(max_n)+1)
elif index_start + len(max_n) <= len(s)-1 and s[index_start + len(max_n)] in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ":
print(len(max_n)+1)
else:
print(-1)
# 此答案用例通过率79%,占用内存超过了限定值
华为机试年前就预约了,过年回去也没怎么准备,年后边上班边刷题,准备了一周多,今天已经参加完机试,不知道能不能通过,后续有时间也会继续刷刷算法题的,还挺有意思的。
个人总结:以后写代码需要多考虑性能问题,不能只求功能的实现。