【华为OD题库-040】计算最接近的数-java

news/2024/5/20 10:10:18 标签: 华为od, java, 滑动窗口

题目

给定一个数组X和正整数K,请找出使表达式X[i]-x[i+1]…-X[i+k-1],结果最接近于数组中位数的下标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+1]…-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

思路

对于任意序列,如:20 5 8 4 3 2 5,k=3
先求中位数,从小到大排序,取中间的数:2 3 4 5 5 8 20,中位数target为5,
初始情况:res=0,diff=20-5-8=7,与target的差值为2。
然后将i右移动,如下:
在这里插入图片描述
此时,diff=5-8-4,以j为参照,i=j-k+1; 和上个区间相比:
diff1=20-5-8
diff2=5-8-4
diff2=diff1-nums[j-k]+2*nums[j-k+1]-nums[j]
此时再来计算diff2与target的差值,看他是否更接近target
依次类推,直到j为最后一个元素。
遍历完成后即可得到目标i=j-k+1

题解

java">package hwod;

import java.util.Arrays;
import java.util.Scanner;

public class CalNearestNum {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] input = sc.nextLine().split("],");
        int k = Integer.parseInt(input[1]);
        int[] nums = Arrays.stream(input[0].substring(1).split(",")).mapToInt(Integer::parseInt).toArray();
        System.out.println(calNearestNum(nums, k));
    }

    private static int calNearestNum(int[] nums, int k) {
        //计算中位数
        int[] sortNums = Arrays.copyOf(nums, nums.length);
        Arrays.sort(sortNums);
        int target = sortNums[nums.length / 2];
        int diff = nums[0];
        for (int i = 1; i < k; i++) {
            diff -= nums[i];
        }
        int res = 0;
        int min = Math.abs(diff - target);
        for (int i = k; i <= nums.length - 1; i++) {
            diff = diff - nums[i - k] + 2 * nums[i - k + 1] - nums[i];
            if (Math.abs(diff - target) <= min) {
                res = i - k + 1;
                min = Math.abs(diff - target);

            }
        }

        return res;


    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。


http://www.niftyadmin.cn/n/5220178.html

相关文章

livox 半固体激光雷达 gazebo 仿真 | 安装与验证

livox 半固体激光雷达 gazebo 仿真 | 安装与验证 livox 半固体激光雷达 gazebo 仿真 | 安装与验证livox 介绍安装验证 livox 半固体激光雷达 gazebo 仿真 | 安装与验证 livox 介绍 览沃科技有限公司&#xff08;Livox&#xff09;成立于2016年。为了革新激光雷达行业&#xf…

大数据-之LibrA数据库系统告警处理(ALM-25500 KrbServer服务不可用)

告警解释 系统按30秒周期性检测组件KrbServer的服务状态。当检测到组件KrbServer服务异常时产生该告警。 当检测到组件KrbServer服务恢复时告警恢复。 告警属性 告警ID 告警级别 可自动清除 25500 致命 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务…

MATLAB的rvctools工具箱熟悉运动学【机械臂机器人示例】

1、rvctools下载安装 rvctools下载地址&#xff1a;rvctools下载 截图如下&#xff0c;点击红色箭头指示的“Download Shared Folder” 即可下载 下载之后进行解压&#xff0c;解压到D:\MATLAB\toolbox这个工具箱目录&#xff0c;这个安装路径根据自己的情况来选择&#xff0c…

Linux虚拟化的模式

三种虚拟化方式&#xff1a;完全虚拟化&#xff08;Full virtualization&#xff09;、硬件辅助虚拟化&#xff08;Hardware-Assisted Virtualization&#xff09;、半虚拟化&#xff08;Paravirtualization&#xff09;。 服务器上的虚拟化软件&#xff0c;多使用 qemu&#…

室内定位(WiFi/UWB/蓝牙等)技术方案概述

室内无法搜索到卫星&#xff0c;这样常规的GPS/北斗定位都无法使用&#xff0c;常规免费的只有运营商的基站定位LBS&#xff0c;但这个精度实在太差&#xff0c;一般都有几十米到几百米的偏差。因此&#xff0c;室内定位一直是个老大难问题。 截至目前&#xff0c;业界比较成熟…

重积分的应用@曲面的面积计算

文章目录 abstract重积分的应用区域投影面积关系曲面的面积&#x1f47a;公式总结&#x1f47a;小结例 利用曲面的参数方程球曲面的面积例 abstract 重积分的应用曲面的面积计算 重积分的应用 由重积分的定义可以直接得出以下应用:二重积分: 曲定柱体的体积平面薄片的质量 三…

Unity播放网络视频

using System.Collections; using System.Collections.Generic; using UnityEngine; using Mx.UI; using Mx.Utils; using UnityEngine.UI; using UnityEngine.Video; /// <summary> 视频UI面板 </summary> public class VideoUIForm : BaseUIForm { private …

netty websocket学习

42-Netty基础-Websocket-Netty握手源码分析 - B站视频 - 很详细 43-FrameDecoder源码分析 【netty专栏】 - 待学习 WebSocket协议&#xff1a;5分钟从入门到精通 SpringBoot 整合 Netty Websocket Spring boot 项目&#xff08;二十三&#xff09;——用 NettyWebsocket实…