豆包 Mars Code刷题 | 视频推荐的算法

104 阅读5分钟

一、问题重述


问题描述

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

二、代码实现


def solution(data):
    # 将字符串数据转为整数列表
    data_list = list(map(int, data.split(',')))
    
    # 对数据进行排序
    data_list.sort()
    
    # 计算80百分位数的索引
    n = len(data_list)
    index = round(n * 0.8) - 1  # 因为索引从0开始,所以要减去1
    
    # 返回该位置的值
    return data_list[index]

if __name__ == "__main__":
    #  You can add more test cases here
    print(solution("10,1,9,2,8,3,7,4,6,5") == 8 )
    print(solution("1,0,8,7,3,9,12,6,4,15,17,2,14,5,10,11,19,13,16,18") == 15)
    print(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)

三、解题思路


解题思路:

  1. 数据输入与预处理

    • 首先,将输入的字符串数据(以逗号分隔)转换为整数列表。
  2. 排序

    • 对数据进行升序排序。
  3. 计算百分位数的位置

    • 计算目标百分位数的位置:position = round(n * p) - 1,其中 n 为数据的总个数,p 为目标百分比(例如 80% 用 0.8 表示)。
    • 使用 round() 对计算出的浮动位置进行四舍五入。
  4. 返回结果

    • 通过计算出的索引返回排序后的数据中对应位置的数值。

关键步骤:

  • 排序:确保数据按升序排列。
  • 四舍五入:正确处理百分位数位置的小数部分。
  • 索引调整:因为列表索引从 0 开始,要根据计算结果调整索引。

四、总结


总结:

  1. 问题本质:我们需要计算数据的某个百分位数,即排序后的数据中位于特定百分比位置的值。例如,80百分位数是排序后位置在80%的数据。

  2. 核心步骤

    • 数据转换与排序:首先,将输入的数据转换为整数并进行升序排序。排序后的数据是查找百分位数的基础。
    • 百分位数位置计算:利用公式 position = round(n * p) - 1 计算出目标位置,其中 n 是数据的总数,p 是目标百分比(例如,80% 为 0.8)。通过 round() 函数处理浮动的小数部分。
    • 返回结果:根据计算出的索引返回排序后的数据中对应位置的值。
  3. 要点

    • 排序:排序是获取百分位数值的前提,必须将数据从小到大排列。
    • 四舍五入:百分位数的计算位置可能是小数,需要使用 round() 函数来确保正确的索引位置。
    • 索引调整:因为列表索引从 0 开始,因此计算得到的位置需要减去 1。
  4. 复杂度

    • 时间复杂度:排序的时间复杂度是 O(n log n),其中 n 是数据的大小。
    • 空间复杂度:O(n),需要额外的空间来存储转换后的数据。
  5. 边界情况

    • 如果数据个数很少,百分位数的计算结果可能会比较直观,直接取最后一个或第一个元素。
    • 如果百分位数计算位置是小数,round() 确保得到最接近的整数索引。

总结来说,解题的关键在于理解如何计算百分位数位置,排序并准确地返回该位置的值。


好了本次分享就到这里了。如果对我感兴趣,可以关注我的GitHub。 也可以加我的飞书一起交流。