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

题目

给定一个数组X和正整数K,请找出使表达式Xi-xi+1...-Xi+k-1,结果最接近于数组中位数的下标i,如果有多个满足条件,请返回最大的i。

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

补充说明:

1.数组X的元素均为正整数;

2.X的长度n取值范围: 2<= n <= 1000;

3.K大于0且小于数组的大小;

  1. i的取值范围:0<=i < 1000;

5.题目的排序数组XN的中位数是XN/2.

示例1

输入:

50,50,2,3,2

输出:

1

说明:

1、中位数为50:50,50,2,3升序排序后变成2,3,50,50,中位数为下标4/2=2的元素50;

2、计算结果为1:X50,50,2,3根据题目计算Xi-xi+1...-Xi+k-1得出三个数

0 (X0-X1= 50 -50),

48(X1-X2= 50 -2),

-1(X2-X3= 2-3),

其中48最接近50,因此返回下标1

说明

根据题目得知,表达式Xi-xi+1...-Xi+k-1,来计算生成的值,如果X数组有i个值,那么表达式生成的数为i-1个。其实我是有点不清楚题目中i+k-1具体要求。例如:

20,5,8,4,3,2,5,3

k=3;在下标为0的表达式 值为 X0-X1-Xi+k-1 这里i+k-1=2,意味着i+k-1为上限的下标值为2,以此类推,当i=5时,表达式的值为X5-X6-X5+3-1这里i+k-1 = 7,已经超出了X的下标,所以这里上限下标应该是X数组的lenght=7。当然,同时、当i=6的时候X6=5,符不符合表达式的要求,在题目给出的例子中,可以看出,它是没有计算i=6时候表达式的值。

所以,给出了几个限制,当i+k-1>X.lenght时就把上限替换为X.lenght。然后,创建一个数组大小为i-1的,来存储表达式的值。

java代码

java 复制代码
package odTest;

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

public class calculateNearVal {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		char[] strList = scanner.nextLine().toCharArray();
		
		String array = "";
		int k = 0;
		for(int i = 0;i<strList.length;i++ ) {
			if(strList[i]=='[') {
				continue;
			}
			if(strList[i]==']') {
				k = strList[i+2]-'0';
				break;
			}
			array = array+strList[i];
		}
		int[] intArray = Arrays.stream(array.split(",")).mapToInt(Integer::parseInt).toArray();
		int[] minusArray = new int[intArray.length-1];
		int topLimit = 0;
		for(int j=0;j<minusArray.length;j++) {
			if(j+1 < j+k-1 && j+k-1<=minusArray.length) {
				topLimit = j+k-1;
			}else if(j+k-1 > minusArray.length) {
				topLimit = minusArray.length;
			}else {
				topLimit = j+1;
			}
			minusArray[j] = intArray[j];
			for(int n=j+1;n<=topLimit;n++) {
				minusArray[j] = minusArray[j] - intArray[n];
			}
		}
		Arrays.sort(intArray);
		int midIndex = intArray.length/2;
//		System.out.println(midIndex);
		int objVal = intArray[midIndex];
		int objectIndex = 0,minVal = Integer.MAX_VALUE;
		for(int i=0;i<minusArray.length;i++) {
			if((objVal-minusArray[i])<=minVal) {
				minVal = objVal-minusArray[i];
				objectIndex = i;
			}
		}
		System.out.println(objectIndex);
	}

}
相关推荐
gz927cool2 分钟前
Python 全栈应用最佳实践完整指南
开发语言·python·ai
智购科技智能售货柜15 分钟前
顾客已经关门,视觉售货柜还在处理旧画面:延迟积压怎么查?~YH
python·单片机·嵌入式硬件·物联网·eclipse
CoderYanger21 分钟前
Java EE 进阶:5. Spring IoC&DI(第三弹):Spring DI
java·开发语言·spring boot·spring·面试·java-ee·mvc
梯度下降者22 分钟前
Python从0到100(三):Python中的变量介绍
python·作用域·变量·数据类型·计算机常识
AIFQuant26 分钟前
Python期货行情API接入:股指、黄金、原油多品种数据管道实战
开发语言·python·金融·区块链·量化开发
一条泥憨鱼36 分钟前
【Kafka】零基础学习教程
java·分布式·学习·kafka
威哥爱编程1 小时前
Python 智能体开发实战 07:让它查课表它张口就编?给 Agent 接上真正能动手的工具
python·agent
Wang's Blog1 小时前
Java 项目实战:交友项目 - 即时通信总结:全链路复盘、可复用清单与自检
java·python·交友
文丑颜不良啊1 小时前
LeetCode1501~1520题目解析
java·leetcode
2601_962885721 小时前
按主板/科创/创业/北交分板扫描选股
python