视频推荐的算法 | 青训营X豆包MarsCode 技术训练营

123 阅读4分钟

题目解析

题目内容

西瓜视频正在开发一个新功能,旨在将访问量达到80百分位数以上的视频展示在首页的推荐列表中。实现一个程序,计算给定数据中的80百分位数。 例如:假设有一个包含从1到100的整数数组,80百分位数的值为80,因为按升序排列后,第80%位置的数字就是80。 99 百分位数:假如有 N 个数据,将数据从小到大排列,99 百分位数是第 N99%位置处的数据(遇到小数时四舍五入获取整数)。一般计算逻辑是先排序,定位到 N99%的位置。返回该位置处的数据。同理,80 百分位数就是第 N*80%位置处的数据。

解题思路

概念理解

  1. 理解百分位数的概念

    • 百分位数是指在一个数据集中,某个百分比位置的数值。例如,80百分位数是指在排序后的数据集中,80%位置的数值。
    • 具体来说,如果一个数据集有N个元素,80百分位数的位置是N * 0.8
  2. 数据结构的选择

    • 使用std::vector来存储整数数据,因为它提供了方便的排序和随机访问功能。
  3. 算法步骤

    • 解析输入字符串:将输入的字符串解析为整数数组。
    • 排序数组:对整数数组进行排序,以便能够准确地找到80百分位数的位置。
    • 计算80百分位数的位置:根据数组长度计算80百分位数的位置,并进行四舍五入处理。
    • 返回结果:返回该位置的数值。

具体步骤

  1. 解析输入字符串

    • 使用std::stringstreamstd::getline将字符串按逗号分割,并转换为整数。
  2. 排序数组

    • 使用std::sort对数组进行排序。
  3. 计算80百分位数的位置

    • 计算n * 0.8,其中n是数组的长度。
    • 使用std::round对计算结果进行四舍五入。
    • 由于数组索引从0开始,所以需要将结果减1。
  4. 返回结果

    • 返回计算位置的数值。

总结

通过以上步骤,你可以准确地计算出给定数据集的80百分位数。

代码解析

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <cmath>  // 添加cmath头文件以使用std::round

int solution(std::string data) {
    // 1. 解析输入字符串为整数数组
    std::vector<int> numbers;
    std::stringstream ss(data);
    std::string item;
    while (std::getline(ss, item, ',')) {
        numbers.push_back(std::stoi(item));
    }

    // 2. 对数组进行排序
    std::sort(numbers.begin(), numbers.end());

    // 3. 计算80百分位数的位置
    int n = numbers.size();
    int index = std::round(n * 0.8) - 1;  // 使用std::round进行四舍五入

    // 4. 返回该位置的数值
    return numbers[index];
}
int main() {
    // 你可以添加更多测试用例
    std::cout << (solution("10,1,9,2,8,3,7,4,6,5") == 8) << std::endl;
    std::cout << (solution("1,0,8,7,3,9,12,6,4,15,17,2,14,5,10,11,19,13,16,18") == 15) << std::endl;
    std::cout << (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) << std::endl;
    return 0;
}

关键步骤解释

  1. 添加cmath头文件:为了使用std::round函数,需要包含<cmath>头文件。
  2. 使用std::round进行四舍五入:在计算80百分位数的位置时,使用std::round函数对n * 0.8的结果进行四舍五入。