【华为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

说明

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

20,5,8,4,3,2,5\],3 k=3;在下标为0的表达式 值为 X\[0\]-X\[1\]-X\[i+k-1\] 这里i+k-1=2,意味着i+k-1为上限的下标值为2,以此类推,当i=5时,表达式的值为X\[5\]-X\[6\]-X\[5+3-1\]这里i+k-1 = 7,已经超出了X的下标,所以这里上限下标应该是X数组的lenght=7。当然,同时、当i=6的时候X\[6\]=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);
	}

}
相关推荐
陈小桔1 天前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven
小学鸡!1 天前
Spring Boot实现日志链路追踪
java·spring boot·后端
xiaogg36781 天前
阿里云k8s1.33部署yaml和dockerfile配置文件
java·linux·kubernetes
逆光的July1 天前
Hikari连接池
java
微风粼粼1 天前
eclipse 导入javaweb项目,以及配置教程(傻瓜式教学)
java·ide·eclipse
番茄Salad1 天前
Spring Boot临时解决循环依赖注入问题
java·spring boot·spring cloud
天若有情6731 天前
Spring MVC文件上传与下载全面详解:从原理到实战
java·spring·mvc·springmvc·javaee·multipart
祈祷苍天赐我java之术1 天前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap
Gitpchy1 天前
Day 20 奇异值SVD分解
python·机器学习
MediaTea1 天前
Python 第三方库:matplotlib(科学绘图与数据可视化)
开发语言·python·信息可视化·matplotlib