计算最接近的数

计算最接近的数

真题目录: 点击去查看

E B卷 100分题型

题目描述

给定一个数组X和正整数K,请找出使表达式:

X[i] - X[i + 1] - … - X[i + K - 1]

结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 i.

其中,数组中位数:长度为N的数组,按照元素的值大小升序排列后,下标为 N/2 元素的值

输入描述

输出描述

备注

  1. 数组X的元素均为正整数
  2. X的长度n取值范围:2 ≤ n ≤ 1000
  3. K大于0目小于数组的大小
  4. i 的取值范围: 0 ≤ i < 1000
  5. 题目的排序数组X[N]的中位数是X[N/2]

用例1

输入

[50,50,2,3],2

输出

1

说明

  1. 中位数为50:[50,50,2,3]升序排序后变成[2,3,50,50],中位数为下标4/2=2的元素50
  2. 计算结果为1:X [50,50,2,3] 根据题目计算X[i] - … - X[i + k - 1] 得出三个数0 (X[0] - X[1] = 50 - 50) 、48 (X[1] - X[2] = 50 - 2) 和 -1 (X[2]-X[3] = 2 - 3) ,其中48最接近50,因此返回下标1。

题解

思路:

  • 模拟 + 滑动窗口
  • 首先将原数组进行排序获取到中位数。
  • 使用滑动窗口迭代获取最接近中位数的值

c++

#include <cstdint>
#include <cstdlib>
#include<iostream>
#include<vector>
#include<string>
#include <utility> 
#include <sstream>
#include<algorithm>
using namespace std;// 通用 split 函数
vector<string> split(const string& str, const string& delimiter) {vector<string> result;size_t start = 0;size_t end = str.find(delimiter);while (end != string::npos) {result.push_back(str.substr(start, end - start));start = end + delimiter.length();end = str.find(delimiter, start);}// 添加最后一个部分result.push_back(str.substr(start));return result;
}int main() {string s;int k;cin >> s;// 分割字符串获取数组元素以及kvector<string> ans = split(s, "],");k = stoi(ans[1]);vector<string> numString = split(ans[0].substr(1), ",");int n = numString.size();vector<int> num(n);for (int i = 0; i < n; i++) {num[i] = stoi(numString[i]);}// 获取中位数vector<int> dp(num);sort(dp.begin(), dp.end());int midNumIndex = n / 2;int midValue = dp[midNumIndex];int res = -1;int diff = INT32_MAX;int left = n-k, right = n - 1;int sum = 0;for (int i = n - 1; i > n - k ; i--) {sum += num[i];}// 双指针迭代获取最小值while (left >= 0) {int tmp = num[left] - sum;if (abs(tmp - midValue) < diff) {diff = abs(tmp- midValue);res = left;}sum -= num[right--];sum += num[left--];}cout << res;return 0;
}

JAVA

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String line = sc.nextLine();int i = line.lastIndexOf(",");int[] x =Arrays.stream(line.substring(1, i - 1).split(",")).mapToInt(Integer::parseInt).toArray();int k = Integer.parseInt(line.substring(i + 1));System.out.println(getResult(x, k));}public static int getResult(int[] x, int k) {int n = x.length;// x数组的中位数int mid = Arrays.stream(x).sorted().toArray()[n / 2];// 初始化滑窗0~k-1, window为滑窗内部元素的表达式计算结果int window = x[0];for (int i = 1; i < k; i++) {window -= x[i];}// window和中位数的差距int minDiff = Math.abs(mid - window);// window滑窗起始索引int idx = 0;// 滑窗右移for (int i = 1; i <= n - k; i++) {// 右移一格后,新滑窗的表达式计算结果window += -x[i - 1] + 2 * x[i] - x[i + k - 1];// 新滑窗window值和中位数的差距int diff = Math.abs(mid - window);// 结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 iif (diff <= minDiff) {minDiff = diff;idx = i;}}return idx;}
}

Python

# 输入获取
tmp = input()i = tmp.rfind(",")x = list(map(int, tmp[1:i-1].split(",")))
k = int(tmp[i+1:])# 实现代码
def getResult():n = len(x)# x数组的中位数mid = sorted(x)[n // 2]# 初始化滑窗0~k-1, window为滑窗内部元素的表达式计算结果window = x[0]for j in range(1, k):window -= x[j]# window和中位数的差距minDiff = abs(mid - window)# window滑窗起始索引idx = 0# 滑窗右移for i in range(1, n-k+1):# 右移一格后,新滑窗的表达式计算结果window += -x[i-1] + 2 * x[i] - x[i + k -1]# 新滑窗window值和中位数的差距diff = abs(mid - window)# 结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 iif diff <= minDiff:minDiff = diffidx = ireturn idx# 算法调用
print(getResult())

JavaScript

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});rl.on("line", (line) => {const i = line.lastIndexOf(",");const x = line.slice(1, i - 1).split(",").map(Number);const k = parseInt(line.slice(i + 1));console.log(getResult(x, k));
});function getResult(x, k) {const n = x.length;const midIdx = Math.floor(n / 2);// x数组的中位数const mid = [...x].sort((a, b) => a - b)[midIdx];// 初始化滑窗0~k-1, window为滑窗内部元素的表达式计算结果let window = x[0];for (let i = 1; i < k; i++) {window -= x[i];}// window和中位数的差距let minDiff = Math.abs(mid - window);// window滑窗起始索引let idx = 0;// 滑窗右移for (let i = 1; i <= n - k; i++) {// 右移一格后,新滑窗的表达式计算结果window += -x[i - 1] + 2 * x[i] - x[i + k - 1];// 新滑窗window值和中位数的差距const diff = Math.abs(mid - window);// 结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 iif (diff <= minDiff) {minDiff = diff;idx = i;}}return idx;
}

Go

package mainimport ("fmt""math""sort""strconv""strings"
)func main() {var s stringfmt.Scanln(&s)// 分割输入字符串parts := strings.Split(s, "],")numStr := strings.Trim(parts[0], "[]")k, _ := strconv.Atoi(strings.TrimSpace(parts[1]))// 转换数字字符串为整数数组numStrs := strings.Split(numStr, ",")num := make([]int, len(numStrs))for i, ns := range numStrs {num[i], _ = strconv.Atoi(strings.TrimSpace(ns))}n := len(num)// 获取中位数sortedNum := append([]int{}, num...) // 复制一份数组以进行排序sort.Ints(sortedNum)midValue := sortedNum[n/2]res := -1diff := math.MaxInt32left, right := n-k, n-1sum := 0// 初始化 sum 为最后 k-1 个元素的总和for i := n - 1; i > n-k; i-- {sum += num[i]}// 滑动窗口,查找最接近中位数的起始位置for left >= 0 {tmp := num[left] - sumif abs(tmp-midValue) < diff {diff = abs(tmp - midValue)res = left}sum -= num[right]right--sum += num[left]left--}fmt.Println(res)
}// 计算绝对值的辅助函数
func abs(x int) int {if x < 0 {return -x}return x
}

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

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

相关文章

Linux——信号量和(环形队列消费者模型)

Linux——线程条件变量&#xff08;同步&#xff09;-CSDN博客 文章目录 目录 文章目录 前言 一、信号量是什么&#xff1f; 二、信号量 1、主要类型 2、操作 3、应用场景 三、信号量函数 1、sem_init 函数 2、sem_wait 函数 3、sem_post 函数 4、sem_destroy 函数 ​​​​​​…

垂直供排水抢险车:守护城市,抗击洪涝|深圳鼎跃

我国面积幅员辽阔&#xff0c;其灾害种类多样&#xff0c;而洪涝灾害是其中最常见的灾害&#xff0c;其容易受强降雨的影响&#xff0c;严重影响人民群众的日常生活。而在洪水肆虐的场景中&#xff0c;快速、高效地排涝和供水是防止次生灾害、保护人民生命财产安全的关键环节。…

Social LSTM:Human Trajectory Prediction in Crowded Spaces | 文献翻译

概要 行人遵循不同轨迹以避免障碍物和容纳同行者。任何在这种场景中巡航的自动驾驶车辆都需要能够遇见行人的未来位置并相应地调整其路线以避免碰撞。轨迹预测问题能够被看作一个顺序生成任务&#xff0c;其中我们对基于行人过去的位置预测其未来的轨迹感兴趣。根据最近RNN&am…

React+AntDesign实现类似Chatgpt交互界面

以下是一个基于React和Ant Design搭建的简单ChatGPT风格前端交互界面代码框架示例&#xff0c;该示例实现了基本的用户输入、发送请求以及展示回复的功能。假设后端有一个模拟接口来处理请求并返回回复。 1. 项目初始化&#xff1a; 确保你已经安装了Node.js和npm。通过以下命…

与“神”对话:Swift 语言在 2025 中的云霓之望

0. 引子 夜深人静&#xff0c;是一片极度沉醉的黑&#xff0c;这便于我与深沉的 macbook 悄悄隐秘于其中。一股异香袭来&#xff0c;恍惚着&#xff0c;撸码中身心极度疲惫、头脑昏沉的我仿佛感觉到了一束淡淡的微光轻洒在窗边。 我的对面若隐若现逐渐浮现出一个熟悉的身影。他…

iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析

引言 在 iOS 开发中&#xff0c;网络请求是常见且致其重要的功能之一。从获取资料到上传数据&#xff0c;出色的网络请求框架能夠大大提升开发效率。 Alamofire 是一个极具人气的 Swift 网络请求框架&#xff0c;提供了便据的 API 以完成网络请求和响应处理。它支持多种请求类…

68,[8] BUUCTF WEB [RoarCTF 2019]Simple Upload(未写完)

<?php // 声明命名空间&#xff0c;遵循 PSR-4 自动加载规范&#xff0c;命名空间为 Home\Controller namespace Home\Controller;// 导入 Think\Controller 类&#xff0c;以便扩展该类 use Think\Controller;// 定义 IndexController 类&#xff0c;继承自 Think\Control…

【C++】引用(上)

1、引用的基本使用 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型&#xff08;该数据类型要与原名的数据类型一致&#xff09; &别名原名&#xff1b; 示例&#xff1a; #include<iostream> using namespace std; int main() {int a 10;int& …

JDBC实验测试

一、语言和环境 实现语言&#xff1a;Java。 环境要求&#xff1a;IDEA2023.3、JDK 17 、MySQL8.0、Navicat 16 for MySQL。 二、技术要求 该系统采用 SWING 技术配合 JDBC 使用 JAVA 编程语言完成桌面应用开发。 三、功能要求 某电商公司为了方便客服查看用户的订单信…

外包公司名单一览表(成都)

大家好&#xff0c;我是苍何。 之前写了一篇武汉的外包公司名单&#xff0c;评论区做了个简单统计&#xff0c;很多人说&#xff0c;在外包的日子很煎熬&#xff0c;不再想去了。 有小伙伴留言说有些外包会强制离职&#xff0c;不行就转岗&#xff0c;让人极度没有安全感。 这…

一些硬件知识【2025/1/21】

小米2K摄像头拆解&#xff1a; 这种小转接板空余部分一般全部打上过孔&#xff1a; 摄像头下面的SENSOR,这一部分才是摄像头的核心&#xff1a; 干硬件多久跳槽一次比较合适&#xff1f;3年跳一次可以吗&#xff1f; eMCC存储芯片外面那一圈焊盘是做什么用的&#xff1f; 没有…

WPF实战案例 | C# WPF实现计算器源码

WPF实战案例 | C# WPF实现计算器源码 一、设计来源计算器应用程序讲解1.1 主界面1.2 计算界面 二、效果和源码2.1 界面设计&#xff08;XAML&#xff09;2.2 代码逻辑&#xff08;C#&#xff09;2.3 实现步骤总结 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&a…

【HBuilderX 中 Git 的使用】

目录&#xff1a; 一&#xff1a;安装必要的版本控制工具二&#xff1a;把Github上的项目克隆到本地三&#xff1a;将本地的项目上传到Github上 一&#xff1a;安装必要的版本控制工具 1️⃣ 安装 TortoiseGit 工具&#xff0c;下载地址&#xff1a;https://tortoisegit.org/do…

浅谈 JVM

JVM 内存划分 JVM 内存划分为 四个区域&#xff0c;分别为 程序计数器、元数据区、栈、堆 程序计数器是记录当前指令执行到哪个地址 元数据区存储存储的是当前类加载好的数据&#xff0c;包括常量池和类对象的信息&#xff0c;.java 编译之后产生 .class 文件&#xff0c;运…

OpenCV简介、OpenCV安装

OpenCV简介、OpenCV安装 本文目录&#xff1a; 零、时光宝盒 一、OpenCV简介 二、OpenCV图像处理基础知识 三、OpenCV-Python环境安装 2.1、纯python环境下安装OpenCV 2.2、Anaconda管理环境下安装 OpenCV 四、如何用OpenCV 中进行读取展示图像 五、OpenCV读取图像、显…

使用Chrome和Selenium实现对Superset等私域网站的截图

最近遇到了一个问题&#xff0c;因为一些原因&#xff0c;我搭建的一个 Superset 的 Report 功能由于节假日期间不好控制邮件的发送&#xff0c;所以急需一个方案来替换掉 Superset 的 Report 功能 首先我们需要 Chrome 浏览器和 Chrome Driver&#xff0c;这是执行数据抓取的…

算法专题(三):二分查找

本篇还是像之前一样&#xff0c;以举例子的形式向大家讲解&#xff01;每道题的题目均是传送门&#xff01;点击跳转对应题&#xff01; 目录 一、二分查找 1.1 题目 1.2 思路 1.3 代码实现 总结&#xff08;模版&#xff09; 朴素版&#xff1a; 二、在排序数组中查找…

在k8s中部署一个可外部访问的Redis Sentinel

1.前提条件&#xff1a; 1.部署了multus 想要k8s外部能访问k8s内部的redis&#xff0c;redis-server启动时必须使用multus的IP 2.helm客户端安装 2.开始安装 准备3个multus ip 10.10.10.130 10.10.10.131 10.10.10.132 apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttac…

使用tritonserver完成clip-vit-large-patch14图像特征提取模型的工程化。

1、关于clip-vit-large-patch14模型 关于openapi开源的clip-vit-large-patch14模型的特征提取&#xff0c;可以参考之前的文章&#xff1a;Elasticsearch向量检索需要的数据集以及768维向量生成这篇文章详细介绍了模型的下载地址、使用方式、测试脚本&#xff0c;可以让你一步…

偏序关系.

一、偏序&#xff08;半序&#xff09;关系 偏序关系 自反反对称传递性 二、全序&#xff08;线序、链&#xff09;关系 三、偏序集中的重要元素 1. 极大元与极小元 极大元找所在集合的一个或几个最高点&#xff1b; 极小元找所在集合的一个或几个最低点。 2. 最大元与最小…