一、题目描述
考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据。
为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的收集打卡记录进行异常排查。
如果出现以下两种情况,则认为打卡异常:
- 实际设备号与注册设备号不一样;
- 同一个员工的两个打卡记录的时间小于60分钟并且打卡距离超过5km。
给定打卡记录的字符串数组clockRecord(每个打卡记录组成为:工号,时间(分钟),打卡距离(km),实际设备号,注册设备号),返回其中异常的打卡记录(按输入顺序输出)。
二、输入描述
第一行输入为N,表示打卡记录数;
之后的N行为打卡记录,每一行为一条打卡记录。
三、输出描述
按顺序输出异常的打卡记录,分号隔开。
四、Java算法源码
/**
* 异常打卡标准:
* 1、实际设备号与注册设备号不一样
* 2、同一个员工的两个打卡记录的时间小于60分钟 且 打卡距离超过5km。
*
* @autor 哪吒编程
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 打卡记录数
int num = Integer.parseInt(sc.nextLine());
// 打卡异常记录
List<String> errorList = new ArrayList<>();
// key:工号,value:打卡记录集合
Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();
for (int i = 0; i < num; i++) {
// 工号,打卡时间(分钟),打卡距离(km),实际设备号,注册设备号
String line = sc.nextLine();
String[] arr = line.split(",");
// 工号
int id = Integer.parseInt(arr[0]);
// 打卡时间(分钟)
int clockTime = Integer.parseInt(arr[1]);
// 打卡距离(km)
int clockDistance = Integer.parseInt(arr[2]);
// 实际设备号与注册设备号不一样,视为异常打卡
if (!arr[3].equals(arr[4])) {
errorList.add(line);
}
// 看看是否有同一个员工的重复打卡
// 同一个员工的两个打卡记录的时间小于60分钟 且 打卡距离超过5km。
List<String> preList = map.get(id);
if (preList != null) {
for (String preLine : preList) {
// 工号,打卡时间(分钟),打卡距离(km),实际设备号,注册设备号
String[] split = preLine.split(",");
// 前后两次的打卡时间差
int time = Math.abs(Integer.parseInt(split[1]) - clockTime);
// 前后两次的打卡距离
int distance = Math.abs(Integer.parseInt(split[2]) - clockDistance);
// 如果满足 同一个员工的两个打卡记录的时间小于60分钟 且 打卡距离超过5km,则这两次都是异常打卡
if (time < 60 && distance > 5) {
// 打卡异常记录
errorList.add(preLine);
errorList.add(line);
}
}
}
List<String> currentList = new ArrayList<String>();
// 如果包含当前id,追加新的打卡记录
if (map.containsKey(id)) {
currentList = map.get(id);
}
// 打卡记录
currentList.add(line);
map.put(id, currentList);
}
if (errorList.size() == 0) {
System.out.println("null");
return;
}
StringBuilder builder = new StringBuilder();
for (String error : errorList) {
builder.append(error).append(";");
}
builder.deleteCharAt(builder.length() - 1);
System.out.println(builder);
}
五、效果展示
1、输入
6
1,10,1,100,100
1,80,10,100,100
1,120,16,100,100
2,80,10,200,200
2,150,15,200,200
3,150,15,200,300
2、输出
1,80,10,100,100;1,120,16,100,100;3,150,15,200,300
3、说明
- 根据规则,先比较实际设备号和注册设备号,如果不同,则是异常打卡记录;
- 比较相同工号的打卡记录,如果两个打卡记录的时间小于60分钟 且 打卡距离超过5km,则这两次都是异常打卡;
第二条打卡和第三条打卡,打卡时间小于60 且 打卡距离大于5,所以都是异常打卡。
第六条实际设备号和注册设备号不同,为异常打卡。
因此按顺序输出第二条打卡、第三条打卡、第六条打卡。
🏆下一篇:华为OD机试真题 Java 实现【获得完美走位】【2023Q1 100分】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。