如果我是面试官,我希望你能够按照以下思路解答这道编程题

问题:

给定一个日期字符串(eg:2013-12-31),判断输入日期是当年中的第几天?

分析:

1.对于输入,一定要谨记一条,所有的用户输入都是不可信的,所以一定要做好验证和异常处理
2.对于以上格式的输入应该怎么去分割出我们需要的年月日整形数值
3.对于单个日期数值的合理性判定
4.对特殊输入特殊处理,比如月份为1,则可以直接返回day
5.如果输入月份大于1,应该怎么考虑求和(列表求和)
6.最后也很重要的一点,闰年和平年的判定一定要记准喽,这关系到当月份大于2的时候是否要多加一天
def get_day_order(dateStr):
    try:
        year, month, day = map(int, dateStr.split('-'))
        #对于字符串的分割结果依然是字符列表,需要将字符列表转换为整形列表,否则后面执行求和操作出抛出异常
    except:
        return 'Not a legal date string!'
    days = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if year <1:
        return 'Ivalid year!'
    if month <1 or month >12:
        return 'Ivalid month!'
    if day>days[month-1] or day<1:
        return 'Ivalid day!'
    if month =1:
    #特殊情况特殊处理,如果不做处理的话下一步的列表求和是有缺陷的,因为当月份为1的时候reduce()函数的传值会出现空序列抛出异常
        return day
    fullMonth = month - 1
    result = reduce(lambda x,y:x+y,days[0:fullMonth])+day
    if not ((year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0))):
    #对于闰年的判断一定要记牢;能被400整除或者能被4整除但是不能被100整除
        if month > 2:
            result -= 1
        if month ==2 and day >28:
            return 'Ivalid days in Febrary!'
    return result

以上只针对面试,不针对实际需求

更多知识点或者面试问答、编程题请关注github仓库https://github.com/LockeyCheng/Python_Interview_Programs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值