2020华为春招第三批机试题

前情提要

华为机试题两个小时3道编程题,每题200分,出题的邮件是来自牛客网,由于笔者没有太多A题经验,闲暇只在Leecode上玩玩,所以,对这个牛客网的I/O不很熟练,导致实际答题时耽误很多时间,第一题只通过90.91%测试用例,第二题只通过40%,第三题来不及做完,但是试后花了点时间自己弄出来了,但是没有测试用例,只是在自己的用例中通过,欢迎大家提供自己的想法,互相交流。

第一题

大意:输入一个字符串,类似1980 01 02 5|1980 01 04,其中‘|’将字符串分成了两部分,分别是两个时间字符串,前一个尾部的5表示星期5,要求是,根据前边的时间部分,推敲出后面的时间是星期几,以整型输出,不需要严格确保该时间1980 01 02是否真的是星期5。
输入:
1980 01 02 5|1980 01 04
输出:
7

我的答案(python3)

不知道哪里忽略了,没有通过全部测试用例,只有通过了90.91%,如果大家发现了bug还请评论区告诉我,感激。

from datetime import datetime

def Week(a):
    time_list = a.split("|")
    startDate = time_list[0][:-2]
    startWeek = time_list[0][-1]
    startDate = '-'.join(startDate.split(' '))
    starttime = datetime.strptime(startDate, "%Y-%m-%d")
    endDate = time_list[1]
    endDate = '-'.join(endDate.split(' '))
    endtime = datetime.strptime(endDate, "%Y-%m-%d")
    time_gap = endtime - starttime
    days = int(time_gap.days)
    endweek = (days % 7 + int(startWeek)) % 7
    if endweek == 0:
        return (str(7))
    else:
        return (str(endweek))


if __name__ == '__main__':

    a = input()
    endweek = Week(a)
    print(endweek)

第二题

第二题没有看明白,只是最后随便写了一个自己想法就提交了,只通过了40%测试用例,这里就不贴我的代码了,如果大家有想法,可以写在评论区,互相学习。

大意: 路灯和公交站,要求调整全部灯的亮度,使得能够最小亮度照亮全部的公交站,假设全部的灯亮度一致
其中输入的第一行是公交站点的位置编号,第二行是路灯的位置编号
输入:
3,1,4,2
3
输出:
2
这里输出亮度为2,解释为,路灯3要想照亮站点1,需要亮度(路灯和公交站的距离)为2才能照亮

第三题

在前面花费过多时间,又对多行输入处理不太熟练,第三题几乎没什么时间了,不过试后花了时间写了自己的笨拙的方法,没有测试用例,只是通过了自己的用例,如果大家有更好的方法,欢迎交流。

大意:
书店老板要进一批新书,书店有一批固定读者,但是老板想要了解读者们都想要看哪些书做问卷调查,来确保进的书的总价格最少又能够满足全部读者需求,假设全部的书价格相同。每个读者至少想要读一本书,设书数小于等于100,读者书小于等于20
输入的第一行是全部的书数,第二行是全部读者数,此后的每一行第一个数字是读者ID,后面是各自想看的书的ID,期间用空格隔开,输出为至少需要进的新书数量。
输入:
5
3
1 1 2
2 2
3 3 4
输出
2

输出2的解释:只需要进两本书,因为1和2号读者都想看2号书,另外要满足三号读者就任选一本3或者4即可,所以2本。

我的答案(Python3)

import sys

def ReSort(book_len):
    return sorted(book_len.items(),key = lambda x:x[1],reverse = True)


try:
    global book_num,readers_num,reader_book
    book_num=readers_num = 0
    reader_book = {}
    flag = 0
    while True:
        line = sys.stdin.readline().strip()
        if line == '':
            break
        if flag==0:
            book_num = line.split()[0]
            flag += 1
        elif flag == 1:
            readers_num = line.split()[0]
            flag += 1
        else:
            book_id = line.split()[1:]
            reader_book[flag-1] = book_id
            flag += 1
except:
    pass

if (int(book_num) > 100):
    print('书数量不得超过100')
    raise ValueError

if (int(readers_num) > 20):
    print('读者数不得超过20')
    raise ValueError

book_reader = {}
book_len = {}
book_len = book_len.fromkeys([str(i+1) for i in range(int(book_num)) ],0)
print(book_num, readers_num, reader_book)
print(reader_book.items())
for val in reader_book.items():
    print(val)
    for i in val[1]:
        if book_reader.get(i,0):
            book_reader[i].append(val[0])
        else:
            m = []
            m.append(val[0])
            book_reader[i] = m
        book_len[i]+=1

#print(book_reader,book_len)
#print(ReSort(book_len))

reader_arr = [i+1 for i in range(int(readers_num))]
count = 0#统计至少要多少本书
while reader_arr:
    sort_book_len = ReSort(book_len)
    cur_book_id = sort_book_len[0][0]
    book_len[cur_book_id] = 0#删除当前最受欢迎的书,设置标志0
    count+=1
    while book_reader[cur_book_id]:
        pop_val = book_reader[cur_book_id].pop()
        try:
            reader_arr.remove(pop_val)
            for i in reader_book[pop_val]:
                if i!=cur_book_id:
                    book_len[i]-=1
                else:
                    continue
        except:
            pass

print(count)

用的是中规中矩的想法,可能很笨拙,只是写完就放这里了,没有进行优化,就想着先分享出去吧,如果大家有更好的想法,欢迎提出。
以上。

你可能感兴趣的:(计算机基础知识)