"视频推荐的算法"Java题解 | 豆包MarsCode AI 刷题

165 阅读3分钟

"视频推荐的算法"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

解题步骤

  1. 解析输入数据

    • 将输入的字符串通过逗号分割,转换成一个整数数组。
  2. 排序数组

    • 使用排序算法将数组从小到大排列,这样可以便于查找百分位数。
  3. 计算百分位数的位置

    • 使用公式 position=round(N×0.8)−1position=round(N×0.8)−1 计算位置。注意数组索引从 0 开始,因此需要减去 1。
  4. 返回结果

    • 通过索引访问数组,返回对应位置的值。

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(Nlog⁡N)O(NlogN),其中 NN 是数组的长度。
  • 空间复杂度:存储数组所需的额外空间为 O(N)O(N)。

结论

通过以上步骤和代码实现,我们能够有效地计算出给定数组的 80 百分位数。这一方法不仅适用于此特定问题,还可以推广到计算其他百分位数或其他统计量。希望本文能对你理解百分位数的计算过程提供帮助!