一道华为笔试题

        这篇博客写作过程中参考了师兄的博客:这里写链接内容

        昨天师兄发过来一道华为笔试题,感觉算是挺经典的题目,今天上午和师兄讨论了一下,并写程序解决了这个问题。题目的描述如下:
举办一场8小时的聚会,时间段从12:00到20:00点,让来访的客人事先填写好到达的时间和离开的时间,为了掌握聚会期间座位的数目,需要先估计不同时间的最大客人数量。

  1. 到达和离开的时间,以整点计算,输入为整数,比如“12,18”表示该客人到达时间为12点后13点前,离开时间是17点后18点前
  2. 按小时区间统计客人的数量,需要统计[12,13),[13,14)…[19,20)共8个时间段的最大客人数量
  3. 假设邀请的客人最多100个
  4. 题目给了一个样例:假设输入为[12,15),[16,17),[12,20),输出为[12,13):2,[13,14):2,[14,15):2,[15,16):1,[16,17):1,[17,18):1,[18,19):1,[19,20):1

        对样例进行分析发现,每个区间的最大客人数量是通过计算能够覆盖该区间的所有客人的时间区间的数量得到的,这样做是有道理的,因为题目要求我们计算的是每个时间段的最大客人数量,如果一个客人的时间区间包含了某个时间段,那么我们有理由认为这个客人会在这个时间段来访。以计算[12,13)时间段的最大客人数量为例,[12,15)区间能够覆盖[12,13)时间段,[16,17)区间不能覆盖,[12,20)区间能够覆盖,所以[12,13)区间的最大客人数量为2,其他的时间段以此类推。

        写了一个python程序对样例进行实现,代码和运行效果如下:

#-*-coding:utf-8-*-
"""
@author:taoshouzheng
@time:2018/8/5 17:00
@email:[email protected]
"""


# 定义按照时间区间统计每个时间区间内到达人数的函数
def count_by_time_interval(lower_bound, higher_bound, customer_time_list):
    """
    :param lower_bound: 区间下界
    :param higher_bound: 区间上界
    :param customer_time_list: 用户的时间列表
    :return: 区间上的最大可能人数
    """
    # 定义某时间区间可能的用户数量
    count = 0
    # 遍历
    for per_cum_list in customer_time_list:
        arrive = per_cum_list[0]        # 到达时间
        leave = per_cum_list[1]     # 最小离开时间
        if lower_bound >= arrive and higher_bound <= leave:
            count += 1
    # 打印
    print('[' + str(lower_bound) + ',' + str(higher_bound) + '):' + str(int(count)))
    # 返回值
    return count


# 主函数
if __name__ == '__main__':
    num_list = list(range(12, 21))      # 数字列表
    all_customer_list = [[12, 15], [16, 17], [12, 20]]      # 所有用户的到达-离开时间的列表
    # 遍历数字列表,统计每个区间上可能到达的顾客数量
    i = 0
    while i < 8:
        low_bound = num_list[i]  # 时间区间的下界
        high_bound = num_list[i + 1]  # 时间区间的上界
        count_by_time_interval(low_bound, high_bound, all_customer_list)
        i += 1

        效果截图如下:


一道华为笔试题_第1张图片

        考虑到最多有100个客人,我们随机产生客人的时间区间,然后采用上述思路计算每个时间段的最大客人数量并输出结果。具体代码如下:

#-*-coding:utf-8-*-
"""
@author:taoshouzheng
@time:2018/8/5 17:00
@email:[email protected]
"""
import random


# 定义随机获取到达和离开时间的函数
def get_arrive_leave_time_by_random(nu_list):
    """
    :param num_list: 用于从中随机抽取到达时间和离开时间的数字列表
    :return: 每个客人的到达和离开时间
    """
    # 每个用户的到达-离开时间列表
    arr_lea_time_list = random.sample(nu_list, 2)
    arr_lea_time_list = sorted(arr_lea_time_list)       # 对列表进行排序
    # 返回值
    return arr_lea_time_list


# 定义按照时间区间统计每个时间区间内到达人数的函数
def count_by_time_interval(lower_bound, higher_bound, customer_time_list):
    """
    :param lower_bound: 区间下界
    :param higher_bound: 区间上界
    :param customer_time_list: 用户的时间列表
    :return: 区间上的最大可能人数
    """
    # 定义某时间区间可能的用户数量
    count = 0
    # 遍历
    for per_cum_list in customer_time_list:
        arrive = per_cum_list[0]        # 到达时间
        leave = per_cum_list[1]     # 最小离开时间
        if lower_bound >= arrive and higher_bound <= leave:
            count += 1
    # 打印
    print('[' + str(lower_bound) + ',' + str(higher_bound) + '):' + str(int(count)))
    # 返回值
    return count


# 主函数
if __name__ == '__main__':
    num_list = list(range(12, 21))      # 数字列表
    all_customer_list = []      # 定义包含所有用户的到达-离开时间的列表
    # 调用函数,生成100个用户的到达-离开时间列表
    i = 0
    while i < 100:
        per_time_list = get_arrive_leave_time_by_random(num_list)       # 每个顾客的到达-离开时间列表
        all_customer_list.append(per_time_list)
        i += 1
    print('...成功生成了100个用户的到达-离开时间')
    print('===================================')

    # 遍历数字列表,统计每个区间上可能到达的顾客数量
    j = 0
    while j < 8:
        low_bound = num_list[j]     # 时间区间的下界
        high_bound = num_list[j+1]      # 时间区间的上界
        count_by_time_interval(low_bound, high_bound, all_customer_list)
        j += 1
    print('===================================')
    print('...完成')

        效果截图如下:


一道华为笔试题_第2张图片

        欢迎交流! QQ:3408649893

你可能感兴趣的:(python,数据)