package a_od_test;
import java.util.ArrayList;
import java.util.Scanner;
/*
异常的打卡记录
知识点数组亨符串哈肴Q表循环
时间限制:1S空间限制:256MB限走语言:不限
题目描述:
考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始
依据,为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的手机打
卡记录进行异常排查。
如果出现以下两种情况,则认为打卡异常:
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^lg<=1000;
2 、 clockRecords[i]格 式 {id},{time},{distance},{actualDeviceNumber},{registeredDeviceNumber}
3、 id由6位数宇组成;
4. time由整数组成,范围为0-1000;
5. distance由整数组成,范围为0*100;
6、 actualDeviceNumberWregisteredDeviceNumber^四位大写宇母组成。
示例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
解题思路:
1. 新建一个类来放置员工的打卡记录
2. 遍历所有的打卡记录;
1-当注册设备号和打卡设备号不一致的时候直接异常(先判断这个)
2.或者两个打卡记录的时问小于60分钟并且打卡距离超过5km直接异常
*/
public class Main27 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = Integer.parseInt(sc.nextLine());
ArrayList<Record> list = new ArrayList<Record>();
ArrayList<Record> result = new ArrayList<Record>();
for (int i = 0; i < num; i++) {
String[] line = sc.nextLine().split(",");
Record record = new Record(Integer.parseInt(line[0]), Integer.parseInt(line[1]), Integer.parseInt(line[2]), line[3], line[4]);
list.add(record);
}
for (int i = 0; i < list.size(); i++) {
Record record1 = list.get(i);
//1、 实际设备号与注册设备号不一样
if (!record1.actualDeviceNumber.equals(record1.registeredDeviceNumber)) {
result.add(record1);
continue;
}
//2、 或者,同一个员工的两个打卡记录的时间小于60分钟并且打卡距离超过5km。
for (int j = i + 1; j < list.size(); j++) {
Record record2 = list.get(j);
int diffTime = Math.abs(record2.time - record1.time);
int diffDistance = Math.abs(record2.distance - record1.distance);
if (diffTime < 60 && diffDistance > 5) {
result.add(record1);
result.add(record2);
break;
}
}
}
if (result.size() == 0) {
System.out.println("null");
} else {
String temp = result.toString().replace("[", "").replace("]", "").replace(";,", ";").replace(" ", "");
System.out.println(temp.substring(0, temp.length() - 1));
}
}
}
// clockRecords格 式 {id},{time},{distance},{actualDeviceNumber},{registeredDeviceNumber}
class Record {
int id;
int time;
int distance;
String actualDeviceNumber;
String registeredDeviceNumber;
public Record(int id, int time, int distance, String actualDeviceNumber, String registeredDeviceNumber) {
this.id = id;
this.time = time;
this.distance = distance;
this.actualDeviceNumber = actualDeviceNumber;
this.registeredDeviceNumber = registeredDeviceNumber;
}
@Override
public String toString() {
return id + "," + time + "," + distance + "," + actualDeviceNumber + "," + registeredDeviceNumber + ";";
}
}
华为OD机试:27 异常的打卡记录
最新推荐文章于 2024-06-14 11:13:03 发布