视频推荐算法

139 阅读2分钟

视频推荐算法

问题描述

西瓜视频正在开发一个新功能,旨在将访问量达到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

在计算百分位数时,通常的做法是:

  1. 计算位置 k = n * 0.8,其中 n 是数组的长度。
  2. 如果 k 是整数,直接取 arr[k-1]
  3. 如果 k 不是整数,通常取 arr[Math.floor(k)]arr[Math.ceil(k)] 的平均值。
  4. 使用了 Math.round,这可能会导致在某些情况下位置计算不准确。例如,如果 n * 0.8 的结果是 4.5Math.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);
    }