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

查看26道真题和解析