联想技术笔试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)#联想#