华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
为了解决新学期学生暴涨的问题,小乐村要建所新学校。考虑到学生上学安全问题,需要所有学生家到学校距离最短。假设学校和所有的学生家,走在一条直线上。请问,学校要建在什么位置,能使得学校到各个学生家的距离之和最短?
二、输入描述
输入的第一行是一个整数N(1<=N<=1000),表示有N户家庭。
输入的第二行是一个数组(0<= <=10000),表示每户家庭的位置,所有家庭的位置都不相同。
三、输出描述
输出一行,一个整数,表示你确定的学校位置。如有多个位置相同,则输出值最小的位置。
四、Java算法源码
public static void main(String[] args) {
// 创建一个Scanner对象,用于读取控制台输入
Scanner sc = new Scanner(System.in);
// 读取一行输入,假设这是一个表示数组大小的字符串
String numStr = sc.nextLine();
// 将表示数组大小的字符串转换为整数类型
int n = Integer.parseInt(numStr);
// 读取下一行输入,这行输入应该包含数组的所有元素(以空格分隔)
String line = sc.nextLine();
// 使用空格分隔输入的字符串,得到字符串数组
String[] split = line.split(" ");
// 创建一个大小为n的整数数组
int[] nums = new int[n];
// 将字符串数组的每个元素转换为整数,并存储在整数数组中
for (int i = 0; i < n; i++) {
nums[i] = Integer.parseInt(split[i]);
}
// 对整数数组进行排序
Arrays.sort(nums);
// 计算中间元素的索引(针对奇数长度数组,中间元素是唯一的;针对偶数长度数组,这是偏左的中间位置)
int index = (n - 1) / 2;
// 输出排序后数组的中间元素
System.out.println(nums[index]);
}
五、效果展示
1、输入
6
0 10 20 30 40 50
2、输出
20
3、说明
20到各个家庭的距离分别为 20 10 0 10 20 30,总和为 90,最小。
有多个位置满足条件,但是20是最小的那个,所以输出20。
六、Python算法源码
# 导入需要的库
from typing import List
# 主函数
def main():
# 创建输入对象
sc = input("请输入一个整数n(表示接下来要输入的整数的个数): ")
# 将输入的字符串转换为整数
n = int(sc)
# 获取用户输入的n个整数,用空格分隔
line = input("请输入{}个整数,用空格分隔: ".format(n))
# 使用空格分割字符串,得到整数列表
split = line.split()
# 转换为整数数组
nums = [int(x) for x in split]
# 对整数数组进行排序
nums.sort()
# 计算中间元素的索引
index = (n - 1) // 2
# 输出排序后数组的中间元素
print(nums[index])
# 如果当前脚本作为主程序运行,则调用main函数
if __name__ == "__main__":
main()
七、JavaScript算法源码
// 导入readline模块用于从标准输入读取数据
const readline = require('readline');
// 创建readline接口实例
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// 定义一个函数来读取一行输入
function readLine() {
return new Promise(resolve => rl.question('', resolve));
}
// 主函数
async function main() {
try {
// 读取一行字符串,表示整数n
const numStr = await readLine();
// 将字符串转换为整数
const n = parseInt(numStr, 10);
// 读取下一行字符串,包含由空格分隔的整数
const line = await readLine();
// 使用空格分割字符串为数组
const split = line.split(" ");
// 初始化一个长度为n的整数数组
const nums = new Array(n).fill(0).map(() => 0);
// 将分割后的字符串数组转换为整数数组
for (let i = 0; i < n; i++) {
nums[i] = parseInt(split[i], 10);
}
// 对整数数组进行排序
nums.sort((a, b) => a - b);
// 计算中间元素的索引
const index = Math.floor((n - 1) / 2);
// 输出排序后数组的中间元素
console.log(nums[index]);
} catch (error) {
console.error('读取输入时发生错误:', error);
} finally {
// 关闭readline接口
rl.close();
}
}
// 调用主函数
main();
八、C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_LENGTH 1000 // 假设输入行的最大长度为1000
int main(int argc, char *argv[]) {
char numStr[MAX_LINE_LENGTH];
printf("Enter the number of integers: ");
fgets(numStr, sizeof(numStr), stdin); // 读取包含整数个数的字符串
numStr[strcspn(numStr, "\n")] = 0; // 移除字符串末尾的换行符
int n = atoi(numStr); // 将字符串转换为整数
char line[MAX_LINE_LENGTH];
printf("Enter the integers separated by spaces: ");
fgets(line, sizeof(line), stdin); // 读取包含整数的字符串
line[strcspn(line, "\n")] = 0; // 移除字符串末尾的换行符
char *split = strtok(line, " "); // 使用空格作为分隔符来分割字符串
int *nums = (int *)malloc(n * sizeof(int)); // 动态分配整数数组
int i = 0;
while (split != NULL) {
nums[i] = atoi(split); // 将分割后的字符串转换为整数并存储到数组中
split = strtok(NULL, " "); // 继续分割字符串直到没有更多元素
i++;
}
// 使用简单的冒泡排序对数组进行排序
for (int j = 0; j < n - 1; j++) {
for (int k = 0; k < n - j - 1; k++) {
if (nums[k] > nums[k + 1]) {
int temp = nums[k];
nums[k] = nums[k + 1];
nums[k + 1] = temp;
}
}
}
int index = (n - 1) / 2; // 计算中间索引
printf("The median integer is: %d\n", nums[index]); // 输出中位数
free(nums); // 释放动态分配的内存
return 0;
}
九、C++算法源码
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
int main() {
std::string numStr;
std::getline(std::cin, numStr); // 从标准输入读取一行字符串到numStr
int n = std::stoi(numStr); // 将字符串转换为整数
std::string line;
std::getline(std::cin, line); // 从标准输入读取一行字符串到line
std::istringstream iss(line); // 使用istringstream处理字符串
std::vector<int> nums; // 定义一个整数向量来存储数字
int num;
while (iss >> num) { // 从iss中读取数字直到结束
nums.push_back(num); // 将读取的数字添加到向量中
}
std::sort(nums.begin(), nums.end()); // 对向量中的数字进行排序
int index = (nums.size() - 1) / 2; // 计算中间元素的索引
std::cout << nums[index] << std::endl; // 输出中间元素
return 0;
}
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。