华为OD机试 - 找出作弊的人(Python/JS/C/C++ 2024 E卷 100分)

news2024/9/27 23:24:08

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

公司组织了一次考试, 现在考试结果出来了,想看一下有没有人存在作弊行为, 但是员工太多了, 需要先对员工进行一次过滤,再进一步确定是否存在作弊行为。

过滤的规则为:找到分差最小的员工ID对(p1, p2)列表,要求p1 < p2。

  1. 员工个数取值范围:0 < n < 100000
  2. 员工ID为整数,取值范围:0 <= n <= 100000
  3. 考试成绩为整数,取值范围:0 <= score <= 300

二、输入描述

员工的ID及考试分数

三、输出描述

分差最小的员工ID对(p1, p2)列表,要求p1 < p2。每一行代表一个集合,每个集合内的员工ID按顺序排列,多行结果也以员工ID对中p1值大小升序排列(如果p1相同则p2升序)。

四、测试用例

测试用例1:

1、输入

5
1 90
2 91
3 95
4 96
5 100

2、输出

1 2
3 4

3、说明

按照分数对员工进行排序,若分数相同,则按照员工ID排序。经过排序,员工的顺序如下:

[1, 90], [2, 91], [3, 95], [4, 96], [5, 100]

我们计算相邻员工的分数差,找到分差最小的情况:

  1. 员工1 和 员工2 的分数差:91 - 90 = 1
  2. 员工2 和 员工3 的分数差:95 - 91 = 4
  3. 员工3 和 员工4 的分数差:96 - 95 = 1
  4. 员工4 和 员工5 的分数差:100 - 96 = 4

最小分差为 1。

找到分差等于最小分差的员工对:

分差为 1 的员工对有两个:

  • 员工1 和 员工2(分数分别为 90 和 91,ID分别为 1 和 2)
  • 员工3 和 员工4(分数分别为 95 和 96,ID分别为 3 和 4)

因为已经按分数和ID排序,我们可以直接将员工对按照 p1 < p2 的顺序输出:

1 2
3 4

测试用例2:

1、输入

5
1 90
2 91
3 92
4 85
5 86

2、输出

1 2
2 3
4 5

3、说明

按照分数对员工进行排序,若分数相同,则按照员工ID排序。经过排序,员工的顺序如下:

[4, 85], [5, 86], [1, 90], [2, 91], [3, 92]

计算相邻员工的分数差,找到分差最小的情况:

  • 员工4 和 员工5 的分数差:86 - 85 = 1
  • 员工5 和 员工1 的分数差:90 - 86 = 4
  • 员工1 和 员工2 的分数差:91 - 90 = 1
  • 员工2 和 员工3 的分数差:92 - 91 = 1

最小分差为 1。

找到分差等于最小分差的员工对:

  • 员工4 和 员工5(分数分别为 85 和 86,ID分别为 4 和 5)
  • 员工1 和 员工2(分数分别为 90 和 91,ID分别为 1 和 2)
  • 员工2 和 员工3(分数分别为 91 和 92,ID分别为 2 和 3)

由于我们要按ID对升序排列输出,因此这些对已经按ID顺序排列,无需进一步排序,最终输出为:

1 2
2 3
4 5

五、解题思路

1、具体步骤:

使用一个二维数组 employees 来存储员工的ID和考试分数。然后按照分数进行排序,这样我们可以通过遍历相邻的员工来找到分数最小的差值对。

对员工按分数进行排序后,分差最小的一定在相邻的两个人之间。因此,我们只需要遍历排序后的员工列表,计算相邻员工分数的差值,找到最小差值并记录所有满足条件的员工ID对。

要求输出时 p1 < p2,即员工ID小的在前。如果两个员工ID相等,则按照ID大小输出。这通过在排序时按分数排列,之后处理ID对时可以自动确保输出顺序。

2、时间复杂度

排序:Arrays.sort 的时间复杂度是 O(n log n),其中 n 是员工数量。在最坏的情况下,n 可能达到 100,000。

遍历和计算分差:我们需要两次遍历员工数组来计算最小分差和找出满足条件的ID对,每次遍历的时间复杂度都是 O(n)。

结果排序:我们对找到的结果进行一次排序,时间复杂度是 O(m log m),其中 m 是最小分差的员工对数量。

因此,总的时间复杂度为 O(n log n),排序操作在这里占主导地位。

3、空间复杂度

二维数组:存储员工的ID和分数的数组的大小是 O(n),其中 n 是员工的数量。

列表 (List<int[]>):用于存储最小分差的员工ID对,其空间复杂度是 O(m),其中 m 是最小分差的员工对数量。

辅助空间:排序算法 Arrays.sort 使用 O(n) 的辅助空间来处理。

因此,空间复杂度为 O(n),因为我们只需存储员工ID和分数,外加一个列表存储结果。

六、Python算法源码

def find_cheating_pairs(employees):
    # 按分数排序,如果分数相同,则按员工ID排序
    employees.sort(key=lambda x: (x[1], x[0]))

    # 找到最小分差
    min_diff = float('inf')
    for i in range(1, len(employees)):
        diff = employees[i][1] - employees[i - 1][1]
        min_diff = min(min_diff, diff)

    result = []

    # 找到所有分差等于最小分差的对
    for i in range(1, len(employees)):
        diff = employees[i][1] - employees[i - 1][1]
        if diff == min_diff:
            p1 = min(employees[i][0], employees[i - 1][0])
            p2 = max(employees[i][0], employees[i - 1][0])
            result.append([p1, p2])

    # 按p1升序排序,如果p1相同则按p2排序
    result.sort(key=lambda x: (x[0], x[1]))

    return result

if __name__ == "__main__":
    # 读取员工个数
    n = int(input())
    employees = []

    # 读取员工ID和分数
    for _ in range(n):
        emp_id, score = map(int, input().split())
        employees.append([emp_id, score])

    # 调用方法处理并输出结果
    result = find_cheating_pairs(employees)

    # 按照格式输出
    for pair in result:
        print(f"{pair[0]} {pair[1]}")

七、JavaScript算法源码

function findCheatingPairs(employees) {
    // 按分数排序,如果分数相同,则按员工ID排序
    employees.sort((a, b) => {
        if (a[1] !== b[1]) return a[1] - b[1];  // 按分数排序
        return a[0] - b[0];  // 如果分数相同,则按ID排序
    });

    // 找到最小分差
    let minDiff = Infinity;
    for (let i = 1; i < employees.length; i++) {
        let diff = employees[i][1] - employees[i - 1][1];
        minDiff = Math.min(minDiff, diff);
    }

    const result = [];

    // 找到所有分差等于最小分差的对
    for (let i = 1; i < employees.length; i++) {
        let diff = employees[i][1] - employees[i - 1][1];
        if (diff === minDiff) {
            let p1 = Math.min(employees[i][0], employees[i - 1][0]);
            let p2 = Math.max(employees[i][0], employees[i - 1][0]);
            result.push([p1, p2]);
        }
    }

    // 按p1升序排序,如果p1相同则按p2排序
    result.sort((a, b) => {
        if (a[0] !== b[0]) return a[0] - b[0];
        return a[1] - b[1];
    });

    return result;
}

// 读取输入并处理结果
function main() {
    const n = parseInt(prompt("请输入员工个数:"));
    const employees = [];

    // 读取员工ID和分数
    for (let i = 0; i < n; i++) {
        const input = prompt("请输入员工ID和分数:").split(' ').map(Number);
        employees.push([input[0], input[1]]);
    }

    // 调用方法处理并输出结果
    const result = findCheatingPairs(employees);

    // 按照格式输出
    result.forEach(pair => {
        console.log(pair[0] + " " + pair[1]);
    });
}

// 调用主函数
main();

八、C算法源码

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int id;
    int score;
} Employee;

// 比较函数用于排序员工
int compare(const void *a, const void *b) {
    Employee *emp1 = (Employee *)a;
    Employee *emp2 = (Employee *)b;
    
    if (emp1->score != emp2->score) {
        return emp1->score - emp2->score;  // 按分数排序
    } else {
        return emp1->id - emp2->id;  // 如果分数相同,按ID排序
    }
}

// 查找分差最小的员工对
void findCheatingPairs(Employee *employees, int n) {
    // 首先对员工按分数和ID排序
    qsort(employees, n, sizeof(Employee), compare);

    // 找到最小分差
    int minDiff = 300;  // 最大分数差为300
    for (int i = 1; i < n; i++) {
        int diff = employees[i].score - employees[i - 1].score;
        if (diff < minDiff) {
            minDiff = diff;
        }
    }

    // 找到所有分差等于最小分差的员工对
    for (int i = 1; i < n; i++) {
        int diff = employees[i].score - employees[i - 1].score;
        if (diff == minDiff) {
            int p1 = employees[i - 1].id;
            int p2 = employees[i].id;
            if (p1 < p2) {
                printf("%d %d\n", p1, p2);
            } else {
                printf("%d %d\n", p2, p1);
            }
        }
    }
}

int main() {
    int n;

    // 读取员工个数
    printf("请输入员工个数: ");
    scanf("%d", &n);

    Employee employees[n];

    // 读取员工ID和分数
    for (int i = 0; i < n; i++) {
        printf("请输入员工ID和分数: ");
        scanf("%d %d", &employees[i].id, &employees[i].score);
    }

    // 查找分差最小的员工对并输出
    findCheatingPairs(employees, n);

    return 0;
}

九、C++算法源码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 定义员工结构体
struct Employee {
    int id;
    int score;
};

// 比较函数,用于排序员工
bool compare(const Employee &a, const Employee &b) {
    if (a.score != b.score) {
        return a.score < b.score;  // 按分数排序
    } else {
        return a.id < b.id;  // 如果分数相同,按ID排序
    }
}

// 查找分差最小的员工对
vector<pair<int, int>> findCheatingPairs(vector<Employee> &employees) {
    vector<pair<int, int>> result;

    // 首先对员工按分数和ID排序
    sort(employees.begin(), employees.end(), compare);

    // 找到最小分差
    int minDiff = INT_MAX;
    for (int i = 1; i < employees.size(); i++) {
        int diff = employees[i].score - employees[i - 1].score;
        minDiff = min(minDiff, diff);
    }

    // 找到所有分差等于最小分差的员工对
    for (int i = 1; i < employees.size(); i++) {
        int diff = employees[i].score - employees[i - 1].score;
        if (diff == minDiff) {
            int p1 = min(employees[i].id, employees[i - 1].id);
            int p2 = max(employees[i].id, employees[i - 1].id);
            result.push_back(make_pair(p1, p2));
        }
    }

    // 按p1升序排序,如果p1相同则按p2排序
    sort(result.begin(), result.end());

    return result;
}

int main() {
    int n;

    // 读取员工个数
    cout << "请输入员工个数: ";
    cin >> n;

    vector<Employee> employees(n);

    // 读取员工ID和分数
    for (int i = 0; i < n; i++) {
        cout << "请输入员工ID和分数: ";
        cin >> employees[i].id >> employees[i].score;
    }

    // 查找分差最小的员工对并输出
    vector<pair<int, int>> result = findCheatingPairs(employees);

    // 输出结果
    for (const auto &pair : result) {
        cout << pair.first << " " << pair.second << endl;
    }

    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2137552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

门店引流神器异形创意LED圆形(饼/盘)显示屏使商业广告更有吸引力

在当今这个信息爆炸的时代&#xff0c;商业竞争日益激烈&#xff0c;如何在众多商家中脱颖而出&#xff0c;吸引顾客的注意力&#xff0c;成为了每个商家亟待解决的问题。而在这个视觉为王的时代&#xff0c;一种创新的门店引流神器——异形创意LED圆形&#xff08;饼/盘&#…

【案例72】Apache检测到目标 URL 存在 http host 头攻击漏洞的解决方案

在网络安全中&#xff0c;我们经常会遇到各种漏洞和攻击&#xff0c;其中 http host 头攻击漏洞是一种比较常见的安全问题。最近&#xff0c;我在处理一个项目时&#xff0c;检测到目标 URL 存在 http host 头攻击漏洞&#xff0c;下面我将分享两种Apache解决这个问题的方法。 …

强烈建议!所有Python基础差的同学,死磕这本64页的背记手册

关于Python书籍的推荐&#xff0c;特别是针对Python背记手册这一类别&#xff0c;虽然直接名为“Python背记手册”的书籍可能不常见&#xff0c;但存在多本详尽的Python学习资料&#xff0c;旨在帮助学习者系统地掌握Python语言的基础知识和进阶技能&#xff0c;这些书籍或资料…

【stm32笔记】使用rtt-studio与stm32CubeMx联合创建项目

使用rtt-studio与stm32CubeMx联合创建项目 创建rt-thread项目 设置项目信息 在项目资源管理器中“右击“&#xff0c;创建RRT studio 项目 双击“RT-Thread 项目“。 选择MCU&#xff0c;设置UART&#xff0c;以及调试方式。添加项目名称&#xff0c;点击“完成“按钮。 …

python画图|极坐标下的3D surface

前述学习过程中&#xff0c;我们已经掌握了3D surface的基本绘制技巧&#xff0c;详见链接&#xff1a; python画图|3D surface基础教程-CSDN博客 基础教程中的3D surface绘制位于笛卡尔坐标系&#xff0c;但有时候会用到极坐标绘图。虽然我们已经学过简单的极坐标绘图技巧&a…

C++: 二叉树进阶面试题

做每件事之前都心存诚意, 就会事半功倍. 目录 前言1. 根据二叉树创建字符串2. 二叉树的层序遍历Ⅰ3. 二叉树的层序遍历Ⅱ4. 二叉树的最近公共祖先5. 二叉搜索树与双向链表6. 根据一棵树的前序遍历与中序遍历构造二叉树7. 根据一棵树的中序遍历与后序遍历构造二叉树8. 二叉树的…

AMD FSR 4已秘密开发1年 支持AI帧生成

作为当今三大超分技术之一&#xff0c;AMD FSR曾经在第二代一度紧紧咬住NVIDIA DLSS&#xff0c;但是进入第三代之后反而差距拉大了&#xff0c;尤其是帧生成技术差了很多。AMD高级副总裁、计算与图形业务事业部总经理Jack Huynh近日透露&#xff0c;FSR 2/3并不是AMD真正想要的…

学习使用在windows系统上安装vue前端框架以及环境配置图文教程

学习使用在windows系统上安装vue前端框架以及环境配置图文教程 1、安装nodejs2、安装vue3、安装Vue-cli脚手架4、安装高版本5、创建vue项目6、启动项目7、配置开发环境8、发布项目 1、安装nodejs 点我查看教程 2、安装vue winR&#xff0c;打开cmd cnpm install vue -g表示安…

Golang数据流处理:掌握Reader和Writer接口的技巧

Golang数据流处理&#xff1a;掌握Reader和Writer接口的技巧 引言理解Reader和Writer接口Reader接口的定义和基本方法Writer接口的定义和基本方法 Reader接口的深入探讨Reader接口的实现示例使用io.Reader读取文件内容从网络连接中读取数据 常用Reader类型及其应用场景strings.…

vue之 package.json和package-lock.json

一、package.json 定义了当前项目所需要引用的各个模块&#xff0c;可以手工修改配置&#xff0c;也可以删除后&#xff0c;使用npm init命令重新自动生成。 但是该文件只锁定大版本号&#xff0c;也就是版本号的第一位&#xff0c;所以你会发现两个文件中同一个包的版本号不一…

【Pycharm】Pycharm创建Django提示pip版本需要升级

目录 1、现象 2、分析 3、本质 前言&#xff1a;经常使用pycharm创建django、flask等项目时候提示pip版本需要升级&#xff0c;解决方案 1、现象 使用Pycharm创建Django项目提示安装Django超时&#xff0c;报错建议pip升级22升级到24 2、分析 之前使用命令升级了pip到了24…

数据库连接池与Druid【后端 16】

数据库连接池与Druid 在现代软件开发中&#xff0c;数据库连接池作为一种关键的技术手段&#xff0c;被广泛用于提升数据库访问的效率和稳定性。本文将深入探讨数据库连接池的概念、常见实现&#xff0c;并重点介绍我国阿里集团开源的数据库连接池——Druid&#xff0c;以及如何…

五星级可视化页面(24):管线管路流程图可视化大屏。

本期分享管线、管路方向可视化大屏&#xff0c;一般用在供水、能源、交通等领域。

本地部署轻量级web开发框架Flask结合内网穿透公网环境访问管理界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程语…

[产品管理-16]:NPDP新产品开发 - 14 - 产品创新流程 - 产品创新流程模型比较:门径、IPD、精益生产、敏捷、系统工程、设计思维、精益创业

目录 一、精益开发与敏捷开发的比较 1、核心理念 2、实践方式 3、应用场景 4、总结 二、门径流程 VS 敏捷方法 1、定义与特点 门径管理流程 敏捷方法 2、应用场景 3、比较 4、总结 三、集成产品开发 VS 系统工程 VS 设计思维 1、集成产品开发&#xff08;IPD&…

LineageOS源码下载和编译(Xiaomi Mi 6X,wayne)

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 源码下载 LineageOS官网&#xff1a;https://lineageos.org/ LineageOS源码 github 地址&#xff1a;https://github.com/LineageOS/android LineageOS源码…

在 Java 中实现 Kafka Producer 的单例模式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

解决 Kylin OS 提示软件包 powerconnect 需要重新安装,但是我无法找到相应的安装文件

解决 Kylin OS 提示软件包 powerconnect 需要重新安装&#xff0c;但是我无法找到相应的安装文件 1、问题现象2、解决办法 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、问题现象 sudo apt-get install -y seahorse生物识别认证 按Q或…

Android 11 FileProvider的使用和限制

概述&#xff1a; 从Android 7开始&#xff0c;将不允许在app之间&#xff0c;使用file uri,即file://的方式&#xff0c;传递一个file&#xff0c;否则会抛出异常&#xff1a;FileUriExposedException &#xff0c;其解决方案&#xff0c;就是使用FileProvider&#xff0c;用c…

【Rust练习】14.流程控制

练习题来自&#xff1a;https://practice-zh.course.rs/flow-control.html 1 // 填空 fn main() {let n 5;if n < 0 {println!("{} is negative", n);} __ n > 0 {println!("{} is positive", n);} __ {println!("{} is zero", n);} } …