"视频推荐的算法"Java题解 | 豆包MarsCode AI 刷题
在数据分析中,百分位数是一种常用的统计量,用于描述数据集中某个值相对于其他值的位置。本文将讨论如何计算一个数组的 80 百分位数,具体包括算法的实现步骤和相关的 Java 代码示例。
题目描述
我们需要实现一个功能,计算给定数组的 80 百分位数。80 百分位数是指将数据从小到大排列后,位于前 80% 位置的数据。具体来说,对于长度为 NN 的数组,80 百分位数对应的位置为 N×0.8N×0.8,如果结果是小数,则需要四舍五入到最近的整数。
输入输出格式
- 输入:以逗号分隔的整数数组,例如
10,1,9,2,8,3,7,4,6,5。 - 输出:数组中 80 百分位数的值,例如上述输入的输出应为
8。
解题步骤
-
解析输入数据:
- 将输入的字符串通过逗号分割,转换成一个整数数组。
-
排序数组:
- 使用排序算法将数组从小到大排列,这样可以便于查找百分位数。
-
计算百分位数的位置:
- 使用公式 position=round(N×0.8)−1position=round(N×0.8)−1 计算位置。注意数组索引从 0 开始,因此需要减去 1。
-
返回结果:
- 通过索引访问数组,返回对应位置的值。
Java 实现
下面是实现上述逻辑的 Java 代码:
java
import java.util.*;
public class Main {
public static int solution(String data) {
// 将输入字符串拆分为整数数组
String[] strArray = data.split(",");
int[] nums = new int[strArray.length];
for (int i = 0; i < strArray.length; i++) {
nums[i] = Integer.parseInt(strArray[i]);
}
// 排序数组
Arrays.sort(nums);
// 计算 80 百分位数的位置
int n = nums.length;
int position = (int) Math.round(n * 0.8) - 1; // 注意数组下标从 0 开始
// 返回该位置的值
return nums[position];
}
public static void main(String[] args) {
// 测试用例
System.out.println(solution("10,1,9,2,8,3,7,4,6,5") == 8);
System.out.println(solution("1,0,8,7,3,9,12,6,4,15,17,2,14,5,10,11,19,13,16,18") == 15);
System.out.println(solution("76,100,5,99,16,45,18,3,81,65,102,98,36,4,2,7,22,66,112,97,68,82,37,90,61,73,107,104,79,14,52,83,27,35,93,21,118,120,33,6,19,85,49,44,69,53,67,110,47,91,17,55,80,78,119,15,11,70,103,32,9,40,114,26,25,87,74,1,30,54,38,50,8,34,28,20,24,105,106,31,92,59,116,42,111,57,95,115,96,108,10,89,23,62,29,109,56,58,63,41,77,84,64,75,72,117,101,60,48,94,46,39,43,88,12,113,13,51,86,71") == 96);
}
}
代码解析
- 数据解析:使用
split方法将输入字符串分割成字符串数组,并使用Integer.parseInt将其转换为整数。 - 排序:使用
Arrays.sort()对数组进行排序。 - 位置计算:根据数组长度计算 80 百分位数的位置,并进行四舍五入。
- 结果返回:通过计算得出的索引获取数组中的值,并返回该值。
复杂度分析
- 时间复杂度:排序操作的时间复杂度为 O(NlogN)O(NlogN),其中 NN 是数组的长度。
- 空间复杂度:存储数组所需的额外空间为 O(N)O(N)。
结论
通过以上步骤和代码实现,我们能够有效地计算出给定数组的 80 百分位数。这一方法不仅适用于此特定问题,还可以推广到计算其他百分位数或其他统计量。希望本文能对你理解百分位数的计算过程提供帮助!