实现100%通过率](http://pic.xiahunao.cn/yaotu/华为OD机试2025C卷-计算最接近的数[200分]( Java _ Python3 _ C++ _ C语言 _ JsNode _ Go)实现100%通过率)
个人主页深夜coding算法 专栏系列2026年华为最新OD机试题库详解 一次订阅永久解锁 | 持续更新100篇 | 6语言全覆盖文章目录❄️前言☀️一题目描述 题目名称 题目内容 输入描述 输出描述 示例☀️二解题思路☀️三代码实现CJavaPython3C语言JavaScriptGo☀️四复杂度分析⭐ 五易错点坑1前缀和数组长度是N1坑2差值是绝对值共勉❄️前言200分题要求在一个数组中找一个长度K的区间使得区间和的绝对值与目标值T的差最小。前缀和滑动窗口两层优化。前缀和把区间和降到O(1)滑动窗口遍历所有K长度区间。☀️一题目描述 题目名称计算最接近的数 题目内容给定一个长度为 N 的整数数组和一个目标值 T要求找出一个长度为 K 的连续子数组使得该子数组的元素之和与 T 的差的绝对值最小。输出这个最小差值。 输入描述第一行N K T三个整数第二行N 个整数1 ≤ K ≤ N ≤ 1000 输出描述输出最小差值的绝对值。 示例输入 5 2 7 1 2 3 4 5 输出 0 说明子数组[3,4]的和为7与T7的差为0☀️二解题思路前缀和pre[i] arr[0]...arr[i-1]区间[i, iK)的和 pre[iK] - pre[i]。遍历所有 i计算差值取最小。☀️三代码实现C#includeiostream#includevector#includecmathusingnamespacestd;intmain(){intN,K,T;cinNKT;vectorintarr(N),pre(N1,0);for(inti0;iN;i){cinarr[i];pre[i1]pre[i]arr[i];}intansINT_MAX;for(inti0;iN-K;i){intsumpre[iK]-pre[i];ansmin(ans,abs(sum-T));}coutansendl;}Javaimportjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);intNsc.nextInt(),Ksc.nextInt(),Tsc.nextInt();int[]prenewint[N1];for(inti0;iN;i)pre[i1]pre[i]sc.nextInt();intansInteger.MAX_VALUE;for(inti0;iN-K;i){intdiffMath.abs(pre[iK]-pre[i]-T);if(diffans)ansdiff;}System.out.println(ans);}}Python3N,K,Tmap(int,input().split())arrlist(map(int,input().split()))pre[0]forxinarr:pre.append(pre[-1]x)ansfloat(inf)foriinrange(N-K1):diffabs(pre[iK]-pre[i]-T)ifdiffans:ansdiffprint(ans)C语言#includestdio.h#includestdlib.hintmain(){intN,K,T,pre[1024]{0};scanf(%d %d %d,N,K,T);for(inti0;iN;i){intx;scanf(%d,x);pre[i1]pre[i]x;}intans0x7fffffff;for(inti0;iN-K;i){intdiffabs(pre[iK]-pre[i]-T);if(diffans)ansdiff;}printf(%d\n,ans);}JavaScriptconst[nkt,arr]require(fs).readFileSync(0,utf-8).trim().split(\n);const[N,K,T]nkt.split( ).map(Number);constnumsarr.split( ).map(Number);constpre[0];for(constxofnums)pre.push(pre[pre.length-1]x);letansInfinity;for(leti0;iN-K;i)ansMath.min(ans,Math.abs(pre[iK]-pre[i]-T));console.log(ans);Gopackagemainimport(fmt;math)funcmain(){varN,K,Tintfmt.Scan(N,K,T)pre:make([]int,N1)fori:0;iN;i{varxint;fmt.Scan(x)pre[i1]pre[i]x}ans:math.MaxInt32fori:0;iN-K;i{diff:pre[iK]-pre[i]-Tifdiff0{diff-diff}ifdiffans{ansdiff}}fmt.Println(ans)}☀️四复杂度分析指标数值时间复杂度O(N)空间复杂度O(N)⭐ 五易错点坑1前缀和数组长度是N1pre[0] 0表示前 0 个元素的和。坑2差值是绝对值abs(sum - T)不是sum - T。共勉前缀和 滑动窗口是OD机试数组题最常用的组合技熟练掌握能搞定一大半区间类问题。关于本专栏一次订阅永久解锁全部100篇真题详解6语言全覆盖Java | Python3 | C | C语言 | JsNode | Go