世界已冷酷至极, 让我们携手前行。
自助收录

2023年华为OD机考真题:异常的打卡记录

算法刷题1年前 (2023)更新 江南白衣
482 0 0
2023年华为OD机考真题:异常的打卡记录

全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。

真题库:https://www.yuque.com/codernav.com/od

题目:异常的打卡记录
知识点:数组字符串哈希表循环
时间限制: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长度<=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
解题思路:
新建一个类来放置员工的打卡记录
遍历所有的打卡记录;
当注册设备号和打卡设备号不一致的时候直接异常(先判断这个)
或者两个打卡记录的时间小于60分钟并且打卡距离超过5km直接异常

代码实现一:

package com.codernav.demo.hwod.exam;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @title 异常的打卡记录
 * @Description 考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据,为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的手机打卡记录进行异常排查。
 * 如果出现以下两种情况,则认为打卡异常:
 * 1、实际设备号与注册设备号不一样
 * 2、或者,同一个员工的两个打卡记录的时间小于60分钟并且打卡距离超过5km。
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/13
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        sc.nextLine();
        List<Record> list = new ArrayList<>();
        List<String> resList = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            String[] strings = sc.nextLine().split(",");
            int id = Integer.parseInt(strings[0]);
            int time = Integer.parseInt(strings[1]);
            int distance = Integer.parseInt(strings[2]);
            String actualId = strings[3];
            String registerId = strings[4];
            Record record = new Record(id, time, distance, actualId, registerId);
            list.add(record);
        }

        for (int i = 0; i < list.size(); i++) {
            Record record1 = list.get(i);
            if (!record1.actualId.equals(record1.registerId)) {   //实际与注册不一致直接异常
                resList.add(record1.toString());
                continue;
            }
            for (int j = i + 1; j < list.size(); j++) {
                Record record2 = list.get(j);
                if (record2.id != record1.id) {   //两个工号不一致不需要进行比较
                    continue;
                }
                int timeDifference = Math.abs(record1.time - record2.time);     //两打卡时间间隔
                int distanceDifference = Math.abs(record1.distance - record2.distance); //两打卡距离
                if (timeDifference < 60 && distanceDifference > 5) {
                    resList.add(record1.toString());
                    resList.add(record2.toString());
                    break;
                }
            }
        }

        if (resList.size() == 0) {
            System.out.println("NULL");
        } else {
            StringBuilder res = new StringBuilder();
            for (String s : resList) {
                res.append(s).append(";");
            }
            System.out.println(res.substring(0, res.length() - 1));
        }

    }

}

class Record {
    int id; // 工号
    int time; // 时间(分钟)
    int distance; // 打卡距离(km)
    String actualId; // 实际设备号
    String registerId; // 注册设备号

    public Record(int id, int time, int distance, String actualId, String registerId) {

        this.id = id;
        this.time = time;
        this.distance = distance;
        this.actualId = actualId;
        this.registerId = registerId;

    }
}

代码实现二:

package com.codernav.demo.hwod.exam;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * @title 异常的打卡记录
 * @Description 考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据,为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的手机打卡记录进行异常排查。
 * 如果出现以下两种情况,则认为打卡异常:
 * 1、实际设备号与注册设备号不一样
 * 2、或者,同一个员工的两个打卡记录的时间小于60分钟并且打卡距离超过5km。
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/13
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //读入数据
        int n = Integer.parseInt(in.nextLine());
        ArrayList<YuanGong> clockRecords = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            String[] str = in.nextLine().split(",");
            YuanGong yuanGong = new YuanGong(Integer.parseInt(str[0]),
                    Integer.parseInt(str[1]),
                    Integer.parseInt(str[2]),
                    str[3],
                    str[4]);
            yuanGong.setError(yuanGong.isErrorData());
            clockRecords.add(yuanGong);
        }

        for (int i = 0; i < clockRecords.size(); i++) {
            for (int j = i + 1; j < clockRecords.size(); j++) {
                if (clockRecords.get(i).id == clockRecords.get(j).id) {
                    int times = clockRecords.get(i).time - clockRecords.get(j).time;
                    int diatances = clockRecords.get(i).distance - clockRecords.get(j).distance;
                    times = times > 0 ? times : times * (-1);
                    diatances = diatances > 0 ? diatances : diatances * (-1);
                    if (times < 60 && diatances > 5) {
                        clockRecords.get(i).setError(true);
                        clockRecords.get(j).setError(true);
                    }
                }
            }
        }

        String str = "";
        for (YuanGong clockRecord : clockRecords) {
            if (clockRecord.error) {
                str += clockRecord + " ";
            }
        }
        if (str.length() == 0) {
            System.out.println("null");
        } else {
            System.out.println(str.trim().replace(" ", ";"));
        }

    }


}

class YuanGong {
    int id;
    int time;
    int distance;
    String actualDeviceNumber;
    String registeredDeviceNumber;
    boolean error;
    
    public YuanGong(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;
        this.error = false;
    }

    public void setError(boolean error) {
        this.error = error;
    }

    public boolean isError() {
        return error;
    }

    @Override
    public String toString() {
        return "" + id + "," + time + "," + distance + "," + actualDeviceNumber + "," + registeredDeviceNumber;
    }

    public boolean isErrorData() {
        return !actualDeviceNumber.equals(registeredDeviceNumber);
    }

}

 

© 版权声明

相关文章

开发者导航新手教程

暂无评论

暂无评论...