视频推荐算法
问题描述
西瓜视频正在开发一个新功能,旨在将访问量达到80百分位数以上的视频展示在首页的推荐列表中。实现一个程序,计算给定数据中的80百分位数。
例如:假设有一个包含从1到100的整数数组,80百分位数的值为80,因为按升序排列后,第80%位置的数字就是80。
99 百分位数:假如有 N 个数据,将数据从小到大排列,99 百分位数是第 N99%位置处的数据(遇到小数时四舍五入获取整数)。一般计算逻辑是先排序,定位到 N99%的位置。返回该位置处的数据。同理,80 百分位数就是第 N*80%位置处的数据。
测试样例
样例1:
输入:
data = "10,1,9,2,8,3,7,4,6,5"输出:8
样例2:
输入:
data = "1,0,8,7,3,9,12,6,4,15,17,2,14,5,10,11,19,13,16,18"输出:15
样例3:
输入:
data = "5,3,9,1,7"输出:7
在计算百分位数时,通常的做法是:
- 计算位置
k = n * 0.8,其中n是数组的长度。 - 如果
k是整数,直接取arr[k-1]。 - 如果
k不是整数,通常取arr[Math.floor(k)]和arr[Math.ceil(k)]的平均值。 - 使用了
Math.round,这可能会导致在某些情况下位置计算不准确。例如,如果n * 0.8的结果是4.5,Math.round(4.5)会返回5,而实际上你应该取arr[4]和arr[5]的平均值。
public static int solution(String data) {
// 将输入的字符串转换为整数数组
String[] s = data.split(",");
int[] arr = new int[s.length];
for (int i = 0; i < s.length; i++) {
arr[i] = Integer.parseInt(s[i]);
}
// 对数组进行排序
Arrays.sort(arr);
// 计算80百分位数的位置
int n = arr.length;
int k = (int) Math.round(n * 0.8);
// 返回该位置的元素
return arr[k - 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);
}