输出:
100000,80,10,ABCE,ABCD
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
python解法
使用 emp 字典来存储每个员工的最后一次打卡信息。键为员工 ID (eid),值为三元组 (最后一次打卡时间, 最后一次打卡地点, 当前记录的索引)。
使用 result 集合来存储异常记录的索引。
遍历记录:
对于每条记录,首先判断报告地址 (ad) 是否与打卡地址 (rd) 一致,如果不一致,则这条记录是异常的,加入到 result 集合中。
然后,检查该员工的前一次打卡记录,若满足打卡时间差小于 60 分钟且打卡地点相差超过 5 米的条件,则认为这两次打卡是异常的,当前记录与之前的记录都应该加入异常记录集合中。
输出结果:
若存在异常记录,则返回按要求格式化的结果,返回所有异常记录的信息,按照异常记录的索引升序排列。
如果没有异常记录,返回 “null”。
n = int(input())
cr = [input().split(",") for _ in range(n)]
def find_abnormal(cr):
emp = {}
result = set()
for i in range(len(cr)):
eid, t, d, ad, rd = cr[i]
if ad != rd:
result.add(i)
if eid in emp:
last_t, last_d, idx = emp[eid]
if int(t) - last_t < 60 and abs(int(d) - last_d) > 5:
result.add(i)
result.add(idx)
emp[eid] = (int(t), int(d), i)
if result:
return ";".join(",".join(cr[i]) for i in sorted(result))
return "null"
print(find_abnormal(cr))
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
java解法
- 解题思路
- 此题要求对员工的打卡记录进行分析,找出异常记录。异常的判断标准有两个:
打卡地址与报告地址不一致,这条记录是异常的。
打卡时间差小于 60 分钟且地点差异超过 5 米,这两条记录是异常的。
解题步骤:
数据存储:
empData:一个哈希表,用于存储每个员工的打卡记录。键是员工 ID(eid),值是该员工所有的打卡记录列表。
errorIdx:一个集合,用于存储异常记录的索引。
解析记录:
对于每条记录,首先检查报告地址与打卡地址是否一致。如果不一致,将该记录的索引加入异常记录集合 errorIdx。
然后,遍历每个员工的记录,检查相邻的打卡记录,如果时间差小于 60 分钟且地点差异超过 5 米,则认为这两次打卡是异常的,添加到异常记录集合。
排序和输出:
对每个员工的记录按照时间进行排序,然后进行时间差和地点差的检查。
如果有异常记录,按要求格式化输出异常记录;如果没有,输出 “null”。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
String[][] logs = new String[n][];
for (int i = 0; i < n; i++) {
logs[i] = input.next().split(",");
}
System.out.println(findAnomalies(logs));
}
public static String findAnomalies(String[][] logs) {
HashMap<String, List<String[]>> empData = new HashMap<>();
Set<Integer> errorIdx = new TreeSet<>();
for (int i = 0; i < logs.length; i++) {
String[] log = Arrays.copyOf(logs[i], logs[i].length + 1);
log[log.length - 1] = String.valueOf(i);
if (!log[3].equals(log[4])) {
errorIdx.add(i);
}
empData.computeIfAbsent(log[0], k -> new ArrayList<>()).add(log);
}
for (String key : empData.keySet()) {
List<String[]> records = empData.get(key);
records.sort(Comparator.comparingInt(a -> Integer.parseInt(a[1])));
for (int i = 0; i < records.size(); i++) {
int t1 = Integer.parseInt(records.get(i)[1]);
int d1 = Integer.parseInt(records.get(i)[2]);
for (int j = i + 1; j < records.size(); j++) {
int t2 = Integer.parseInt(records.get(j)[1]);
int d2 = Integer.parseInt(records.get(j)[2]);
if (t2 - t1 >= 60) break;
if (Math.abs(d2 - d1) > 5) {
errorIdx.add(Integer.parseInt(records.get(i)[5]));
errorIdx.add(Integer.parseInt(records.get(j)[5]));
}
}
}
}
if (errorIdx.isEmpty()) return "null";
StringJoiner sj = new StringJoiner(";");
for (int idx : errorIdx) {
sj.add(String.join(",", logs[idx]));
}
return sj.toString();
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
C++解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
C解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
JS解法
报告地址和打卡地址不一致。
同一员工的打卡记录之间,时间差小于 60 分钟,且地点差异大于 5 米。
步骤:
输入数据处理:
记录的格式为 [员工ID, 打卡时间, 打卡地点, 预计打卡地点, 报告打卡地点]。
需要遍历每一条记录,并检查打卡地址是否与报告地址一致。
需要将每一条记录按照员工 ID 分类存储,以便后续对同一员工的打卡记录进行时间和地点差的检查。
判断异常条件:
如果报告地址与打卡地址不一致,记录为异常。
对于每个员工的记录,按照打卡时间升序排序,然后检查相邻记录的时间差和地点差。
如果时间差小于 60 分钟且地点差大于 5 米,则这两条记录都标记为异常。
输出:
如果有异常记录,输出异常记录的内容,按要求格式化(记录间用 ; 分隔)。
如果没有异常记录,输出 “null”。
function findAnomalies(logs) {
const empData = new Map();
const errorIdx = new Set();
logs.forEach((log, i) => {
const extendedLog = [...log, i.toString()];
if (extendedLog[3].trim() !== extendedLog[4].trim()) {
errorIdx.add(i);
}
if (!empData.has(extendedLog[0])) {
empData.set(extendedLog[0], []);
}
empData.get(extendedLog[0]).push(extendedLog);
});
for (const key of empData.keys()) {
const records = empData.get(key);
records.sort((a, b) => parseInt(a[1]) - parseInt(b[1]));
for (let i = 0; i < records.length; i++) {
const t1 = parseInt(records[i][1]);
const d1 = parseInt(records[i][2]);
for (let j = i + 1; j < records.length; j++) {
const t2 = parseInt(records[j][1]);
const d2 = parseInt(records[j][2]);
if (t2 - t1 >= 60) break;
if (Math.abs(d2 - d1) > 5) {
errorIdx.add(parseInt(records[i][5]));
errorIdx.add(parseInt(records[j][5]));
}
}
}
}
if (errorIdx.size === 0) return "null";
const result = Array.from(errorIdx)
.map(idx => logs[idx].join(","))
.join(";");
return result;
}
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('', (n) => {
const logs = [];
let count = 0;
rl.on('line', (input) => {
if (input.trim() === '') return;
logs.push(input.split(","));
count++;
if (count === parseInt(n)) {
console.log(findAnomalies(logs));
rl.close();
}
});
});
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: