当前位置: 首页 > 面试经验 >

【华为OD机试2023】异常的打卡记录Python

优质
小牛编辑
177浏览
2023-03-28

【华为OD机试2023】异常的打卡记录Python

题目描述:

考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据,为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的手机打卡记录进行异常排查。 如果出现以下两种情况,则认为打卡异常: 1、实际设备号与注册设备号不一样 2、或者,同一个员工的两个打卡记录的时间小于60分钟并且打卡距离超过5km。 给定打卡记录的字符串数组clockRecords(每个打卡记录组成为:工号;时间(分钟);打卡距离(km);实际设备号;注册设备号),返回其中异常的打卡记录(按输入顺序输出)。

输入描述:

第一行输入为N,表示打卡记录数;

之后的N行为打卡记录,每一行为一条打卡记录。

例如:

2

100000,10,1,ABCD,ABCD

100000,50,10,ABCD,ABCD

输出描述:

输出为异常的打卡记录,例如:100000,10,1,ABCD,ABCD;100000,50,10,ABCD,ABCD

补充说明:

1、clockRecords长度<=1000; 2、clockRecords[i]格式:{id},{time},{distance},{actualDeviceNumber},{registeredDeviceNumber} 3、id由6位数字组成; 4、time由整数组成,范围为0~1000; 5、distance由整数组成,范围为0~100; 6、actualDeviceNumber与registeredDeviceNumber由四位大写字母组成。

示例1

输入:

2

100000,10,1,ABCD,ABCD

100000,50,10,ABCD,ABCD

输出:

100000,10,1,ABCD,ABCD;100000,50,10,ABCD,ABCD

说明:

第一条记录是异常的,因为第二条记录与它的间隔不超过60分钟但是打卡距离超过了5km,同理第二条记录也是异常的。

示例2

输入:

2

100000,10,1,ABCD,ABCD

100000,80,10,ABCE,ABCD

输出:

100000,80,10,ABCE,ABCD

说明:

第二条记录的注册设备号与打卡设备号不一致,所以是异常记录

示例3

输入:

2

100000,10,1,ABCD,ABCD

100001,80,10,ABCE,ABCE

输出:

null

说明:

无异常打卡记录,所以返回null

解题思路:

字典存储打卡信息,由于需要按照输入顺序输出,所以在存储打卡信息时,还需要记录输入顺序


n=int(input())
jilus=[input().split(',') for i in range(n)]
employees={}
ans=set()
for i in range(n):
id,time,dis,sjsb,zcsb=jilus[i]
if sjsb!=zcsb:
ans.add(i)
else:
daichajilu=[id,time,dis,i]
if employees.get(id)==None:
employees[id]=[daichajilu]
else:
employees[id].append(daichajilu)
for id in employees.keys():
daka=employees[id]
length=len(daka)
daka.sort(key=lambda x:x[1])
if n >=2:
for j in range(length):
time1=int(daka[j][1])
dis1=int(daka[j][2])
for k in range(j+1,length):
time2 = int(daka[k][1])
dis2 = int(daka[k][2])
if time2-time1>=60:
break
else:
if abs(dis1-dis2)>5:
if daka[i][3] not in ans:
ans.add(daka[i][3])
if daka[j][3] not in ans:
ans.add(daka[j][3])
if len(ans)>=1:
ans=sorted(list(ans))
daishuchu=[','.join(jilus[i]) for i in ans]
print(';'.join(daishuchu))
else:
print('null')

 类似资料: