华为OD机试 - 小明找位置 - 二分查找(Python/JS/C/C++ 2024 E卷 100分)

news/2024/10/19 13:29:55/

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

小明要出操,按学号从小到大排成一列;小明来迟了,请你给小明出个主意,让他尽快找到他应该排的位置。

算法复杂度 要求不高于Log(n),学号为整数类型,队列规模<=10000;

二、输入描述

第一行: 输入已排成队列的小朋友的学号 (整数数),以","隔开

例如: 93,95,97,100,102,123,155

第二行: 小明学号,例如 110;

三、输出描述

输出一个数字,代表队列位置(从 1 开始)

例如: 6

四、测试用例

测试用例1:

1、输入

93, 95, 97, 100, 102, 123, 155
110

2、输出

6

3、说明

小明的学号是110,队列按升序排列:

93, 95, 97, 100, 102, 123, 155

根据二分查找,110应该插入的位置是102之后、123之前,因此返回的排队位置是6(从1开始计数)。

测试用例2:

1、输入

1,5,10,15,20,25,30
18

2、输出

5

3、说明

小明的学号是18,队列按升序排列:

1, 5, 10, 15, 20, 25, 30

根据二分查找,18应该插入在15之后、20之前,因此返回的排队位置是5。

五、解题思路

我们可以利用Java的Arrays.binarySearch方法来实现二分查找,如果没有找到精确匹配的位置,binarySearch会返回负数,我们可以根据这个负数值推断出插入点。

  1. 首先,将输入的队列学号进行处理,将字符串转换为整型数组。
  2. 采用二分查找(Binary Search)的方式,找到小明应该插入的位置。
  3. 根据找到的位置输出正确的排队位置(从1开始计数)。

六、Python算法源码

python">import bisectdef find_position(queue, xiaoMingID):# 使用bisect库进行二分查找index = bisect.bisect_left(queue, xiaoMingID)# 如果找到了小明的学号,返回实际位置 + 1(从1开始的索引)if index < len(queue) and queue[index] == xiaoMingID:return index + 1# 如果没找到,返回应该插入的位置(也是从1开始的索引)return index + 1def main():# 读取输入的学号队列input_queue = input().strip()queue_array = input_queue.split(",")# 转换成整数列表queue = [int(num.strip()) for num in queue_array]# 读取小明的学号xiaoMingID = int(input().strip())# 使用二分查找来找到小明应该插入的位置position = find_position(queue, xiaoMingID)# 输出结果,position已经是从1开始的索引print(position)# 测试程序
if __name__ == "__main__":main()

七、JavaScript算法源码

javascript">function findPosition(queue, xiaoMingID) {// 使用二分查找查找小明的插入位置let left = 0;let right = queue.length - 1;// 二分查找算法while (left <= right) {let mid = Math.floor((left + right) / 2);if (queue[mid] === xiaoMingID) {return mid + 1; // 找到了小明的学号,返回从1开始的位置} else if (queue[mid] < xiaoMingID) {left = mid + 1;} else {right = mid - 1;}}// 如果没有找到,left即为小明应插入的位置,返回从1开始的索引return left + 1;
}function main() {// 读取输入的学号队列let inputQueue = prompt("请输入学号队列 (以逗号分隔):");let queueArray = inputQueue.split(",");// 转换成整数数组let queue = queueArray.map(num => parseInt(num.trim()));// 读取小明的学号let xiaoMingID = parseInt(prompt("请输入小明的学号:"));// 使用二分查找查找小明应该插入的位置let position = findPosition(queue, xiaoMingID);// 输出结果,position已经是从1开始的索引console.log(position);
}// 调用主函数
main();

八、C算法源码

#include <stdio.h>int findPosition(int queue[], int size, int xiaoMingID) {int left = 0;int right = size - 1;// 二分查找算法while (left <= right) {int mid = (left + right) / 2;if (queue[mid] == xiaoMingID) {return mid + 1; // 找到了小明的学号,返回从1开始的位置} else if (queue[mid] < xiaoMingID) {left = mid + 1;} else {right = mid - 1;}}// 如果没找到,返回插入位置(从1开始的索引)return left + 1;
}int main() {char inputQueue[100];int queue[100], size = 0, xiaoMingID;// 读取输入的学号队列printf("请输入学号队列 (以逗号分隔): ");fgets(inputQueue, sizeof(inputQueue), stdin);// 将输入的字符串转换成整数数组char *token = strtok(inputQueue, ",");while (token != NULL) {queue[size++] = atoi(token);token = strtok(NULL, ",");}// 读取小明的学号printf("请输入小明的学号: ");scanf("%d", &xiaoMingID);// 使用二分查找来找到小明应该插入的位置int position = findPosition(queue, size, xiaoMingID);// 输出结果,position已经是从1开始的索引printf("%d\n", position);return 0;
}

九、C++算法源码

#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>using namespace std;// 使用二分查找来找到小明的插入位置
int findPosition(const vector<int>& queue, int xiaoMingID) {int left = 0;int right = queue.size() - 1;// 二分查找算法while (left <= right) {int mid = left + (right - left) / 2;if (queue[mid] == xiaoMingID) {return mid + 1; // 找到了小明的学号,返回从1开始的位置} else if (queue[mid] < xiaoMingID) {left = mid + 1;} else {right = mid - 1;}}// 如果没有找到,left 即为小明应插入的位置,返回从1开始的索引return left + 1;
}int main() {string inputQueue;vector<int> queue;int xiaoMingID;// 读取输入的学号队列cout << "请输入学号队列 (以逗号分隔): ";getline(cin, inputQueue);stringstream ss(inputQueue);string token;// 将输入的字符串转换成整数数组while (getline(ss, token, ',')) {queue.push_back(stoi(token));}// 读取小明的学号cout << "请输入小明的学号: ";cin >> xiaoMingID;// 使用二分查找查找小明应该插入的位置int position = findPosition(queue, xiaoMingID);// 输出结果,position已经是从1开始的索引cout << position << endl;return 0;
}

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

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

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

在这里插入图片描述


http://www.ppmy.cn/news/1538894.html

相关文章

美畅物联丨剖析 GB/T 28181 与 GB 35114:视频汇聚领域的关键协议

我们在使用畅联云平台进行视频汇聚时&#xff0c;经常会用的GB/T 28181协议&#xff0c;前面我们写了关于GB/T 28181的相关介绍&#xff0c;​ 详见《畅联云平台&#xff5c;关于GB28181你了解多少&#xff1f;》。 ​最近也有朋友向我们咨询GB 35114协议与GB/T 28181有什么不同…

KubeSphere部署mysql

演示示例使用的是3.4.1&#xff0c;各版本有名字差异 功能是一样的 由于mysql需要做数据持久化所以需要挂载数据 1.创建mysql基础配置 项目中-配置-配置字典 mysql-conf添加键值对 [client] default-character-setutf8mb4 [mysql] default-character-setutf8mb4 [mysqld] …

STM32传感器模块编程实践(六) 1.8寸液晶屏TFT LCD彩屏简介及驱动源码

文章目录 一.概要二.TFT彩屏主要参数三.TFT彩屏参考原理图四.TFT彩屏模块接线说明五.模块SPI通讯协议介绍六.TFT彩屏模块显示1.显示英文字符串2.显示数字3.显示中文 七.TFT彩屏实现图片显示八.STM32单片机1.8寸 TFT LCD显示实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 九…

2025推荐选题|基于J2EE的高校教研管理平台系统的研发与实现

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

I.MX6U 之实时时钟(RTC)详解

目录 一、引言 二、I.MX6U RTC 概述 1.功能简介 2.硬件结构 三、I.MX6U RTC 的特性 1.低功耗模式 2.高精度计时 3.闹钟和中断功能 4.闰年自动调整 四、I.MX6U RTC 的编程方法 1.初始化 RTC 2. 读取时间和日期 3.设置闹钟 4.处理闹钟中断 五、I.MX6U RTC 的应用场…

【Linux系列】写入文本到文件

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

12.JVM类加载机制

一、什么是JVM JVM是一种计算设备规范&#xff0c;虚构出的一个计算机&#xff0c;具有跨平台的特性&#xff1b; 包含类加载器、程序计数器、执行引擎、堆栈、方法区&#xff08;元数据区&#xff09;、本地方法栈 二、类加载全过程 加载过程如下&#xff1a;加载 --》验证…

three.js快速入门 ---Threejs第一个3D场景

Three.js中文学习地址:http://www.webgl3d.cn/Three.js/ 一、示例 根据这个例子学习 效果图: <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><title>第一个three.js文件_WebGL三维场景</title&g…