63.视频推荐算法

2 阅读3分钟

问题描述

西瓜视频正在开发一个新功能,旨在将访问量达到80百分位数以上的视频展示在首页的推荐列表中。实现一个程序,计算给定数据中的80百分位数。

例如:假设有一个包含从1到100的整数数组,80百分位数的值为80,因为按升序排列后,第80%位置的数字就是80。

99 百分位数:假如有 N 个数据,将数据从小到大排列,99 百分位数是第 N99%位置处的数据(遇到小数时四舍五入获取整数)。一般计算逻辑是先排序,定位到 N99%的位置。返回该位置处的数据。同理,80 百分位数就是第 N*80%位置处的数据。

问题理解

我们需要计算给定数据中的80百分位数。80百分位数是指在排序后的数据中,位于第80%位置的数值。具体来说,如果有N个数据,将数据从小到大排列,80百分位数是第N*80%位置处的数据(遇到小数时四舍五入获取整数)。这个概念在统计学中非常重要,因为它可以帮助我们了解数据的分布情况,特别是在数据量较大时,80百分位数能够反映出大部分数据的位置。

数据结构选择

  1. 数组:我们选择使用数组来存储输入的数据,因为数组可以方便地进行排序和索引访问。数组是一种线性数据结构,能够高效地存储和访问数据。

算法步骤

  1. 输入处理

    • 将输入的字符串按照逗号分割成字符串数组。这一步是为了将输入的字符串转换为可操作的数据结构。
    • 将字符串数组转换为整数数组。这一步是为了方便后续的数值计算和排序操作。
  2. 排序

    • 对整数数组进行排序,以便能够准确地找到80百分位数的位置。排序是计算百分位数的关键步骤,因为只有排序后的数据才能准确地定位到特定百分位数的位置。
  3. 计算80百分位数的位置

    • 计算数组长度N。这一步是为了确定数据的总数,从而计算出80百分位数的位置。
    • 计算80百分位数的位置:index = (int) Math.round(N * 0.8) - 1。这里减1是因为数组索引从0开始。四舍五入是为了确保位置计算的准确性,特别是在数据量较大时。
  4. 返回结果

    • 返回排序后数组中对应位置的数值。这一步是为了将计算结果返回给用户,以便用户能够看到最终的80百分位数。

总结

通过以上步骤,我们可以准确地计算出给定数据中的80百分位数。这个方法的核心在于排序和位置计算,确保我们能够找到正确的数值。排序是计算百分位数的基础,而位置计算则是确定具体数值的关键。通过这种方法,我们可以在任何数据集中准确地找到80百分位数,从而更好地理解数据的分布情况。

solution完整代码

    public static int solution(String data) {
        // 将输入的字符串转换为整数数组
        String[] parts = data.split(",");
        int[] numbers = new int[parts.length];
        for (int i = 0; i < parts.length; i++) {
            numbers[i] = Integer.parseInt(parts[i]);
        }

        // 对数组进行排序
        Arrays.sort(numbers);

        // 计算80百分位数的位置
        int n = numbers.length;
        int index = (int) Math.round(n * 0.8) - 1; // 注意:数组索引从0开始

        // 返回该位置的值
        return numbers[index];
    }