华为OD机试真题 - 构成正方形的数量(Java & JS & Python & C & C++)

题目描述

为了解决新学期学生暴涨的问题,小乐村要建所新学校。考虑到学生上学安全问题,需要所有学生家到学校距离最短。假设学校和所有的学生家,走在一条直线上。请问,学校要建在什么位置,能使得学校到各个学生家的距离之和最短?

输入描述

输入的第一行是一个整数N(1<=N<=1000),表示有N户家庭。

输入的第二行是一个数组(0<= <=10000),表示每户家庭的位置,所有家庭的位置都不相同。

输出描述

输出一行,一个整数,表示你确定的学校位置。如有多个位置相同,则输出值最小的位置。

算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String numStr = sc.nextLine();
    int n = Integer.parseInt(numStr);

    String line = sc.nextLine();
    String[] split = line.split(" ");
    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]);
}

控制台输出

输入

6
0 10 20 30 40 50

输出

20

说明

20到各个家庭的距离分别为 20 10 0 10 20 30,总和为 90,最小。

有多个位置满足条件,但是20是最小的那个,所以输出20。

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();

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()

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;  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值