2026/4/18 8:53:25
网站建设
项目流程
自己怎样做优惠券网站,杭州住房和城乡建设部网站,仿煎蛋wordpress,全球中文网站排名(新卷,100分)- 计算最接近的数#xff08;Java JS Python C#xff09;题目描述给定一个数组X和正整数K#xff0c;请找出使表达式#xff1a;X[i] - X[i 1] - ... - X[i K - 1]结果最接近于数组中位数的下标 i #xff0c;如果有多个 i 满足条件Java JS Python C题目描述给定一个数组X和正整数K请找出使表达式X[i] - X[i 1] - ... - X[i K - 1]结果最接近于数组中位数的下标 i 如果有多个 i 满足条件请返回最大的 i.其中数组中位数长度为N的数组按照元素的值大小升序排列后下标为 N/2 元素的值输入描述无输出描述无备注数组X的元素均为正整数X的长度n取值范围2 ≤ n ≤ 1000K大于0目小于数组的大小i 的取值范围: 0 ≤ i 1000题目的排序数组X[N]的中位数是X[N/2]用例输入[50,50,2,3],2输出1说明中位数为50[50,50,2,3]升序排序后变成[2,3,50,50]中位数为下标4/22的元素50计算结果为1X [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。题目解析本题应该是采用核心代码模式非ACM模式因此不需要我们处理输入输出。下面代码仍然以ACM模式实现但是会将输入输出处理 和 核心代码 分离。考试时只需要写出核心代码即可。本题可以使用滑动窗口解题。本题其实就是要遍历所有长度为k的滑窗滑窗内部元素需要按照表达式X[i] - X[i 1] - ... - X[i K - 1]来求得该滑窗对应得表达式计算结果window。然后求解window和数组x中位数mid的差距差距绝对值越小则说明二者越接近结果最接近于数组中位数的下标 i 如果有多个 i 满足条件请返回最大的 i.本题的难点在于滑窗右移时新、旧滑窗的状态转移。假设旧滑窗的表达式计算结果为window那么新滑窗的表达式计算结果应该是window - x[i-1] x[i] * 2 - x[i k -1]其中 x[i] * 2 的原因是新滑窗中x[i]是正的而旧滑窗中x[i]是负的为了将-x[i] 变为 x[i] 则需要为 -x[i] x[i] * 2JS算法源码/* 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 满足条件请返回最大的 i if (diff minDiff) { minDiff diff; idx i; } } return idx; }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 满足条件请返回最大的 i if (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[i1:]) # 核心代码 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-k1): # 右移一格后新滑窗的表达式计算结果 window -x[i-1] 2 * x[i] - x[i k -1] # 新滑窗window值和中位数的差距 diff abs(mid - window) # 结果最接近于数组中位数的下标 i 如果有多个 i 满足条件请返回最大的 i if diff minDiff: minDiff diff idx i return idx # 算法调用 print(getResult())C算法源码#include stdio.h #include string.h #include stdlib.h #define MAX_SIZE 1000 int getResult(const int x[], int n, int k); int cmp(const void *a, const void *b) { return (*(int *) a) - (*(int *) b); } int main() { char s[100000]; scanf(%s, s); char *p strrchr(s, ,); *p \0; int nums[MAX_SIZE]; int nums_size 0; char *token strtok(s 1, ,); while (token ! NULL) { nums[nums_size] atoi(token); token strtok(NULL, ,); } int k atoi(p 1); printf(%d\n, getResult(nums, nums_size, k)); return 0; } int getResult(const int x[], int n, int k) { int x_cp[n]; for(int i0; in; i) x_cp[i] x[i]; // 这里排序的是x_cp数组不能改变原数组x qsort(x_cp, n, sizeof(int), cmp); // x数组的中位数 int mid x_cp[n / 2]; // 初始化滑窗0~k-1, window为滑窗内部元素的表达式计算结果 int window x[0]; for (int i 1; i k; i) { window - x[i]; } // window和中位数的差距 int minDiff 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 abs(mid - window); // 结果最接近于数组中位数的下标 i 如果有多个 i 满足条件请返回最大的 i if (diff minDiff) { minDiff diff; idx i; } } return idx; }