【华为OD题库-040】计算最接近的数-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且小于数组的大小;

  1. 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),查看当前专栏更新的所有题目。

相关推荐
吃喝不愁霸王餐APP开发者2 分钟前
基于Spring Cloud Gateway实现对外卖API请求的统一鉴权与流量染色
java·开发语言
a努力。5 分钟前
美团Java面试被问:Redis集群模式的工作原理
java·redis·后端·面试
一雨方知深秋14 分钟前
面向对象编程
java·封装·this·构造器·static关键字·成员变量·javabean实体类
资生算法程序员_畅想家_剑魔17 分钟前
Java常见技术分享-11-责任链模式
java·spring boot·责任链模式
计算机程序设计小李同学1 小时前
动漫之家系统设计与实现
java·spring boot·后端·web安全
程序员阿鹏1 小时前
责任链模式
java·spring·servlet·tomcat·maven·责任链模式
@淡 定1 小时前
Java内存模型(JMM)详解
java·开发语言
czhc11400756632 小时前
C# 1221
java·servlet·c#
黄俊懿2 小时前
【深入理解SpringCloud微服务】Seata(AT模式)源码解析——全局事务的回滚
java·后端·spring·spring cloud·微服务·架构·架构师
派大鑫wink2 小时前
【Day12】String 类详解:不可变性、常用方法与字符串拼接优化
java·开发语言