笔试题记录

156 阅读3分钟

**# 2020新标研发面试笔试题

背景

用户可以按月订购我们的服务,平台为了简化逻辑,不按自然月的天数而是统一按每月 30 天来计算服务周期。

例子1:用户在 2020 年 8 月 18 日订购一个月,30 天后是 2020 年 9 月 17 日,因为订购当天也算有效服务期,所以服务周期是 2020.08.18~2020.09.16。

例子2:用户在 2020 年 8 月 18 日订购半年,180 天后是 2021 年 2 月 14 日,因为订购当天占用了一天,所以服务周期是 2020.08.18~2021.02.13。

日期规则提示:每年的1、3、5、7、8、10、12月有31天,4、6、9、11月有30天,闰年的2月有29天,非闰年的2月有28天;如果年份是4的倍数,且不是100的倍数,或者是400的倍数,该年是闰年。

问题一 (填空)

今天是 20__23__年_11___月_18___ 日,如果今天订购服务,请分别计算不同周期的到期日 一个月订购周期的到期日是__2023.12.18__ 三个月订购周期的到期日是_2024.2.16___ 半年订购周期的到期日是_2024.5.16___ 一年订购周期的到期日是__2024.11.12__

问题二 (编码)

为了在计算服务周期的更多业务里提供统一逻辑,请使用你熟悉的语言完成给定年月返回当月总天数的函数,但不要使用语言的系统库或第三方库,例如 Python 的代码应该如下 粗暴地使用字典保存月份对应的天数,然后用if语句来判断是否闰年

def get_days(year, month):
    r_mon_dic = {1:31,2:29,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31}
    p_mon_dic = {1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31}
    global days
    days=0
    if year > 1970 and year <2099 and month>0 and month <12:
       if year %4==0 or year%10==0 or year%400==0:
          days = r_mon_dic.get(month)
       else:
          days = p_mon_dic.get(month)
    else:
        return "输入的年月分超出范围"
    return days

输入数据在 1970 年至 2099 年之间,例如输入 2020, 8 ,返回应该是 31  请在完成逻辑代码后给出你认为必要的测试数据来验证此代码的正确性,举例:

assert get_days(2020, 8) == 31

问题三 (编码)

用户订购我们服务的费用不是在订购付款后一次性付给我们,而是平台在每月底进行结算。比如 2020 年 8 月 18 日订购一个月服务的费用是 60 元,因此每天的服务费用是 2 元,则在 2020 年 8 月 31 日结束时,将这 60 元里的 28 元结算给我们, 而八月的服务天数是 14 天。

考虑将此问题通用化,在特定的日期订购一个月服务,总费用是 n 元,则该月底我们能结算到多少钱?

请使用你熟悉的语言完成一个函数(用上问题二的 get_days):给定订购年月日和一个月的费用,返回当月可结算金额。

例如 Python 的代码应该如下:

def first_month_cost(year, month, day, n):
   days = get_days(year, month)
    deta = days - day
    day_n = n//30
    if day ==1:
       m = (deta)*day_n
    else:
       m = (deta+1)*day_n
    return m

输入数据在 1970 年至 2099 年之间,n 保证是 30 的倍数,例如输入 2020, 8, 1, 30 ,返回应该是 30 

assert first_month_cost(2020, 8, 18, 60) == 28
assert first_month_cost(2020, 8, 1, 30) == 30

**