联想技术笔试0.5---第二题【考勤时间】题解

第二题
问题描述
某公司新推出了一套考勤系统,公司将通过这套系统获取员工们的实际工作时长。这套考勤系统的计算方式是以出入公司的打卡时间为计算依据的,当打了出门卡时,系统会将该出门记录的时间与最近一次进公司记录的时间做差,这样就得到了一个实际工作区间。
但是由于打卡是自愿的,有些员工的记录并不是进出间隔的,可能会出现两条连续进入记录或两条连续出门记录,当出现多条连续出门记录时,仅计算第一次出门对应的工作时长,后面的出门记录作废。如果当天第一条记录是出门记录,则该记录无效。
现在给出你某员工的打卡记录,请你计算出他当日的工作时长。
输入描述
输入第一行包含一个正整数n,表示该员工这一天的打卡记录数量。(1<=n<=50)
接下来有n行,每行首先是一个字符串“in”或“out”,分别表示进入和出去。之后是一个时间表示“xx:yy:zz“,表示一个时刻,精确到秒。
输出描述
请你输出一个形如”xx:yy:zz”的字符串,表示该员工的工作时长。


思路:模拟题,但是需要细心,第一,注意退位,小时可能会被分钟抢时间,分钟可能会被秒抢时间;第二,注意逻辑,时间一定是出门打卡的时候和最近一次进门记录作差,所以进门记录会一直被更新。并且一旦打了出门卡,进门记录就全清空了,之后也不能直接“出门”,必须先打进门卡。

代码:

#考勤时间
while(1):
    line = input().strip()
    if len(line)<=0:break
    n = int(line)
    times = []
    while(n>0):
        t = input().strip()
        times.append(list(t.split(' ')))
        n-=1
    res = [0,0,0]
    stack = []
    for t in times:
        if not stack:
            if t[0]=='in':stack.append(t)
        else:
            if t[0]=='in':stack = [t]
            else:
                start_t = stack.pop(0)
                start_h,start_m,start_s =  [int(x) for x in start_t[1].split(':')]
                end_h,end_m,end_s =  [int(x) for x in t[1].split(':')]
                res[0]+=(end_h-start_h)
                minutes = end_m-start_m
                if minutes<0:
                    res[0]-=1
                    minutes+=60
                res[1]+=minutes
                seconds = end_s-start_s
                if seconds<0:
                    res[1]-=1
                    seconds+=60
                res[2]+=seconds
    ans = ''
    if res[0]<10:ans+='0'
    ans+=str(res[0])
    ans+=':'
    if res[1]<10:ans+='0'
    ans+=str(res[1])
    ans+=':'
    if res[2]<10:ans+='0'
    ans+=str(res[2])
    print(ans)

#联想#
全部评论

相关推荐

醒工硬件:1学校那里把xxxxx学院去了,加了学院看着就不像本校 2简历实习和项目稍微精简一下。字太多,面试官看着累 3第一个实习格式和第二个实习不一样。建议换行 4项目描述太详细了,你快把原理图贴上来了。比如可以这样描述:使用yyyy芯片,使用xx拓扑,使用pwm控制频率与占空比,进行了了mos/电感/变压器选型,实现了xx功能 建议把技术栈和你做的较为有亮点的工作归纳出来 5熟悉正反激这个是真的吗
点赞 评论 收藏
分享
程序员卤馆:加v细说
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务