问题描述
西瓜视频正在开发一个新功能,旨在将访问量达到80百分位数以上的视频展示在首页的推荐列表中。实现一个程序,计算给定数据中的80百分位数。
例如:假设有一个包含从1到100的整数数组,80百分位数的值为80,因为按升序排列后,第80%位置的数字就是80。
99 百分位数:假如有 N 个数据,将数据从小到大排列,99 百分位数是第 N 99%位置处的数据(遇到小数时四舍五入获取整数)。一般计算逻辑是先排序,定位到 N99%的位置。返回该位置处的数据。同理,80 百分位数就是第 N*80%位置处的数据。 我们需要计算给定数据中的80百分位数。80百分位数是指在排序后的数据中,位于第80%位置的数值。具体来说,如果数据有N个元素,那么80百分位数就是排序后第 `N * 0.8` 位置的元素。
数据结构选择
- 输入数据:输入是一个字符串,表示一组用逗号分隔的整数。
- 处理数据:我们需要将字符串转换为整数数组,以便进行排序和计算。
算法步骤
- 解析输入字符串:将输入的字符串按逗号分割成字符串数组。
- 转换为整数数组:将字符串数组转换为整数数组。
- 排序:对整数数组进行升序排序。
- 计算80百分位数的位置:计算
N * 0.8的位置,并四舍五入得到整数位置。 - 返回结果:返回排序后数组中对应位置的元素。
代码
import java.util.Arrays;
public class Main {
public static int solution(String data) {
// 1. 解析输入字符串
String[] dataArray = data.split(",");
// 2. 转换为整数数组
int[] numbers = new int[dataArray.length];
for (int i = 0; i < dataArray.length; i++) {
numbers[i] = Integer.parseInt(dataArray[i]);
}
// 3. 排序
Arrays.sort(numbers);
// 4. 计算80百分位数的位置
int position = (int) Math.round(numbers.length * 0.8);
// 5. 返回结果
return numbers[position - 1];
}
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("5,3,9,1,7") == 7);
}
}