华为OD机试 - 积木最远距离(Python/JS/C/C++ 2024 E卷 100分)

news2024/12/24 11:37:18

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

小华和小薇一起通过玩积木游戏学习数学。

他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。

小华随机拿一些积木块并排成一排,请你帮她找到这排积木中相同数字且所处位置最远的2块积木,计算它们的距离,小薇请你帮忙着地解决这个问题。

二、输入描述

第一行输入为N,表示小华排成一排的积木总数。

接下来N行每行一个数字,表示小华排成一排的积木上数字。

三、输出描述

相同数字的积木块位置最远距离;如果所有积木块的数字都不相同,请返回-1。

备注

0 <= 积木上的数字 < 109

1 <= 积木长度 <= 105

四、测试用例

测试用例1:

1、输入

5
1
2
3
1
4

2、输出

3

3、说明

共有5个积木,第1个和第4个积木数字相同,其距离为3。

测试用例2:

1、输入

2
1
2

2、输出

-1

3、说明

共有两个积木,没有积木数字相同,返回-1。

测试用例3:

1、输入

6
5
1
5
2
5
3

2、输出

4

3、说明

数字5在索引0、2、4出现。最大距离是4 - 0 = 4。

五、解题思路

为了找到一排积木中相同数字且位置最远的两块积木,我们可以采用以下步骤:

  1. 遍历积木序列:我们需要遍历整个积木序列,记录每个数字第一次出现的位置。
  2. 记录第一次出现的位置:使用一个哈希表(HashMap)来存储每个数字第一次出现的索引位置。
  3. 计算距离:当我们再次遇到已经存在于哈希表中的数字时,计算当前索引与第一次出现的索引之间的距离,并更新最大距离。
  4. 输出结果:遍历完成后,如果找到了至少一对相同数字的积木,输出最大的距离;否则,输出-1。

这种方法的时间复杂度为O(N),适用于N高达10^5的情况。

六、Python算法源码

# 导入必要的模块
import sys

def main():
    # 读取输入
    N = int(sys.stdin.readline())  # 读取积木总数N
    first_occurrence = {}  # 初始化哈希表,用于存储数字第一次出现的位置
    max_distance = -1  # 初始化最大距离为-1

    for i in range(N):
        num = int(sys.stdin.readline())  # 读取当前积木上的数字
        if num in first_occurrence:
            # 计算当前索引与第一次出现索引之间的距离
            distance = i - first_occurrence[num]
            if distance > max_distance:
                max_distance = distance  # 更新最大距离
        else:
            # 记录数字第一次出现的位置
            first_occurrence[num] = i

    # 输出结果
    print(max_distance)

if __name__ == "__main__":
    main()

七、JavaScript算法源码

// 导入读取输入的模块
const readline = require('readline');

function main() {
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });

    let input = [];
    rl.on('line', (line) => {
        input.push(line);
    });

    rl.on('close', () => {
        let N = parseInt(input[0]); // 读取积木总数N
        let firstOccurrence = new Map(); // 初始化哈希表
        let maxDistance = -1; // 初始化最大距离为-1

        for (let i = 0; i < N; i++) {
            let num = BigInt(input[i + 1]); // 读取当前积木上的数字,使用BigInt处理大数
            if (firstOccurrence.has(num)) {
                // 计算当前索引与第一次出现索引之间的距离
                let distance = i - firstOccurrence.get(num);
                if (distance > maxDistance) {
                    maxDistance = distance; // 更新最大距离
                }
            } else {
                // 记录数字第一次出现的位置
                firstOccurrence.set(num, i);
            }
        }

        // 输出结果
        console.log(maxDistance);
    });
}

main();

八、C算法源码

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

// 定义哈希表的大小
#define HASH_SIZE 100003

// 定义哈希表节点结构
typedef struct Node {
    long long key; // 数字
    int value; // 第一次出现的位置
    struct Node* next; // 指向下一个节点的指针
} Node;

// 哈希函数
int hash_func(long long key) {
    return key % HASH_SIZE;
}

int main(){
    int N;
    scanf("%d", &N); // 读取积木总数N

    // 初始化哈希表
    Node* hash_table[HASH_SIZE];
    for(int i=0;i<HASH_SIZE;i++) {
        hash_table[i] = NULL;
    }

    int maxDistance = -1; // 初始化最大距离为-1

    for(int i=0; i<N; i++) {
        long long num;
        scanf("%lld", &num); // 读取当前积木上的数字

        int hash_index = hash_func(num); // 计算哈希值
        Node* current = hash_table[hash_index];
        int found = 0;
        while(current != NULL){
            if(current->key == num){
                // 计算当前索引与第一次出现索引之间的距离
                int distance = i - current->value;
                if(distance > maxDistance){
                    maxDistance = distance; // 更新最大距离
                }
                found = 1;
                break;
            }
            current = current->next;
        }
        if(!found){
            // 插入新的节点到哈希表
            Node* newNode = (Node*)malloc(sizeof(Node));
            newNode->key = num;
            newNode->value = i;
            newNode->next = hash_table[hash_index];
            hash_table[hash_index] = newNode;
        }
    }

    // 输出结果
    printf("%d\n", maxDistance);

    // 释放内存
    for(int i=0;i<HASH_SIZE;i++) {
        Node* current = hash_table[i];
        while(current != NULL){
            Node* temp = current;
            current = current->next;
            free(temp);
        }
    }

    return 0;
}

九、C++算法源码

#include <iostream>
#include <unordered_map>
using namespace std;

int main() {
    ios::sync_with_stdio(false); // 关闭同步,加快输入速度
    cin.tie(0); // 取消cin和cout的绑定

    int N;
    cin >> N; // 读取积木总数N

    unordered_map<long long, int> firstOccurrence; // 初始化哈希表
    int maxDistance = -1; // 初始化最大距离为-1

    for (int i = 0; i < N; i++) {
        long long num;
        cin >> num; // 读取当前积木上的数字

        if (firstOccurrence.find(num) != firstOccurrence.end()) {
            // 计算当前索引与第一次出现索引之间的距离
            int distance = i - firstOccurrence[num];
            if (distance > maxDistance) {
                maxDistance = distance; // 更新最大距离
            }
        } else {
            // 记录数字第一次出现的位置
            firstOccurrence[num] = i;
        }
    }

    // 输出结果
    cout << maxDistance << "\n";

    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/2181288.html

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

相关文章

[Everything] 文件搜索工具的下载及详细安装使用过程(附有下载文件)

快速搜索文件名及其所在路径 下载链接在文末 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文 解压后得到文件 双击exe文件得到 选择简体中文&#xff0c;点击OK 点击“我接受” 更改安装目录&#xff0c;最好不要放在C盘&#xff0c;点击下一步 点击下一步 点…

使用SNAP工具处理Sentinel-1数据应注意磁盘和内存问题

近期使用SNAP处理数据比较多&#xff0c;有一些心得给大家分享一下&#xff01;在预处理Sentinel-1数据 的过程中出错基本上是有3种情况&#xff1a; 磁盘被写满 由于JAVA优化一般是通过空间换效率的方式。所以SNAP为了提高效率&#xff0c;本版本升级增加了数据本地缓存的比重…

zabbix7.0监控linux主机案例详解

前言 服务端配置 链接: rocky9.2部署zabbix服务端的详细过程 环境 主机ip应用zabbix-server192.168.10.11zabbix本体zabbix-client192.168.10.12zabbix-agent zabbix-server(服务端已配置) 具体实现过程 zabbix-client配置 安装zabbix-agent 添加扩展包 dnf -y instal…

nlp任务之预测中间词-huggingface

目录 1.加载编码器 1.1编码试算 2.加载数据集 3.数据集处理 3.1 map映射&#xff1a;只对数据集中的sentence数据进行编码 3.2用filter()过滤 单词太少的句子过滤掉 3.3截断句子 4.创建数据加载器Dataloader 5. 下游任务模型 6.测试预测代码 7.训练代码 8.保…

MKV转MP4丨FFmpeg的简单命令使用——视频格式转换

MKV是一种视频封装格式&#xff0c;很好用&#xff0c;也是OBS的默认推荐录制格式&#xff0c;因为不会突然断电关机而导致整个视频录制文件丢失。 但是MKV无法直接导入PR中剪辑&#xff0c;最直接的方法是将MKV转换为MP4格式&#xff0c;最方便且安全无损的转换方法便是用FFmp…

AD软件的分屏显示功能

1.鼠标右键点击上面的窗格&#xff0c;选择“垂直分布”&#xff0c;即可以将AD软件分屏&#xff0c;左边选择原理图&#xff0c;右边选择PCB即可以方便去设计PCB的布局。实现原理图和pcb文件的同时查看。 还可以建立起2个图之间的联动关系。 比如我们在电路图里面选择stm32 m…

Threejs中使用A*算法寻路导航

<!DOCTYPE html> <html><head><title>Threejs中使用A*算法寻路导航&#xff0c;Threejs室内室外地图导航</title><script type"text/javascript" src"libs/three.js"></script><script type"text/javas…

MySQL | union all 和union(去重和不去重)

题1&#xff1a; 现在运营想要分别查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据&#xff0c;请取出相应结果&#xff0c;结果不去重。 示例&#xff1a;user_profile 根据示例&#xff0c;你的查询应返回以下结果&#xff1a; UNION&#xff08…

【C/C++】 秋招常考面试题最全总结(让你有一种相见恨晚的感觉)

目录 1.C程序编译链接过程 2.浅拷贝和move有区别吗 3.深拷贝和浅拷贝的区别 4.空类的大小 5.类的继承有几种方式&#xff0c;区别是什么&#xff1f; 六、extern 关键字的作用 七、static关键字的作用 八、指针和引用的区别 九、C内存分配方式 十、结构体对齐…

manim中的桌面设计和实现转换

在这段代码中&#xff0c;我们实现了一系列富有创意和动态效果的数学表达式展示。这种展示方式不仅能够吸引观众的注意力&#xff0c;还能有效地传达复杂的数学概念。代码主要围绕一个点 dot 展开&#xff0c;它逐步转变为不同的数学公式和符号&#xff0c;每个转变过程都伴随着…

JUC高并发编程5:多线程锁

1 锁的八个问题演示 标准访问&#xff0c;先打印短信还是邮件 class Phone{public synchronized void sendSMS() throws InterruptedException {System.out.println("----------sendSMS");}public synchronized void sendEmail(){System.out.println("-------…

AndroidStudio导入so文件

点击app 右键依次选择New-Floder-JNI Floder 创建jni目录 将需要的so文件拷贝到jni目录 在app目录下&#xff0c;build.gradle文件的android{}中添加&#xff1a; sourceSets {main{jniLibs.srcDirs [src/main/jni]}}点击一下Sync Project with Gradle Files 然后编译生成AP…

第7届医联赛圆满举行,鱼跃医疗连续6年保障赛事安全

9月22日-26日&#xff0c;第7届医联赛戈壁群英会在甘肃瓜州举行&#xff0c;来自全国各地的3000名医药行业企业家代表齐聚一堂&#xff0c;开启为期3天的身心极限挑战——徒步穿越81公里的戈壁滩。鱼跃医疗连续6年全程保障参赛者的生命安全&#xff0c;助力赛事圆满完成。 鱼跃…

大模型初学者指南:笔记本电脑上用 ollama 运行大模型!

之前国外有一初学者小哥在Google Colab&#xff08;A100 40G&#xff09;利用DPO微调Mistral 7B&#xff0c;微调后的模型在基准测试中取得不错的成绩&#xff0c;从那时起&#xff0c;我觉得在笔记本电脑上运行/微调大模型并非遥不可及的。 对于初学者而言&#xff0c;如果能…

[论文精读]Multi-Channel Graph Neural Network for Entity Alignment

论文网址&#xff1a;Multi-Channel Graph Neural Network for Entity Alignment (aclanthology.org) 论文代码&#xff1a;https:// github.com/thunlp/MuGNN 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&a…

插上网线无法连接网络,控制面板以太网消失 | 如何重装网络驱动

如果你确定你的网线没问题&#xff0c;网线插口没问题&#xff0c;那你大概率就是驱动问题&#xff0c;可以试一下本方法。 0 以太网消失 事情是这样的&#xff0c;我工作时候需要接内网&#xff0c;插网线&#xff0c;摸鱼时候连外网&#xff0c;我就把网线关了。 每次插网线…

飞致云开源社区月度动态报告(2024年9月)

自2023年6月起&#xff0c;中国领先的开源软件公司FIT2CLOUD飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营…

STM32F1+HAL库+FreeTOTS学习13——二值信号量

STM32F1HAL库FreeTOTS学习13——二值信号量 1. 信号量2. 二值信号量3. 相关API函数3.1 创建二值信号量3.2 获取信号量3.3 释放信号量3.4 删除信号量 4. 二值信号量操作实验1. 实验内容2. 代码实现&#xff1a;3. 运行结果 上一期我们学习了FreeRTOS中的队列&#xff0c;这一期我…

【Linux探索学习】第二弹——Linux的基础指令(中)——夯实基础第二篇

Linux基础指令&#xff08;上&#xff09;&#xff1a;【Linux探索学习】第一弹——Linux的基本指令&#xff08;上&#xff09;——开启Linux学习第一篇-CSDN博客 前言&#xff1a; 在前面我们已经讲解了一些常用的Linux的基础指令&#xff0c;那些当然是远远不够的&#xff…