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

114 阅读4分钟

问题描述

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

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

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

思路分析

  1. 将输入字符串转换为数值列表
  2. 对数据进行排序
  3. 计算80百分位数的位置
  4. 返回该位置的数值

算法步骤

  1. 解析输入数据:将输入的字符串数据解析为整数数组。
  2. 排序数组:对数组进行升序排序。
  3. 计算80百分位数的位置
    • 计算数组的长度 n
    • 计算80百分位数的位置 position = int(round(n * 0.8)) - 1。这里减1是因为数组索引从0开始。
  4. 确保位置有效:确保计算出的位置不会超出数组的范围。
  5. 返回结果:返回数组中对应位置的数值。

代码实现

def solution(data):
    # Please write your code here
    numbers = [int(x) for x in data.split(',')]

    numbers.sort()
    
    # 计算80百分位数的位置
    n = len(numbers)
    position = int(round(n * 0.8)) - 1  
    
    # 确保position不会超出数组范围
    position = max(0, min(position, n - 1))
    
    # 返回80百分位数
    return numbers[position]
    # return -2

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)

关键步骤

  • 排序:确保数组是升序排列的。
  • 位置计算:使用 round 函数来四舍五入计算位置,并注意数组索引从0开始。

知识总结

  1. 数据解析与转换

    • 字符串分割:使用 split 方法将字符串按指定分隔符分割成列表。
    • 类型转换:使用 int 函数将字符串转换为整数。
  2. 数组操作

    • 列表推导式:使用列表推导式快速生成列表。
    • 排序:使用 sort 方法对列表进行排序。
  3. 百分位数计算

    • 位置计算:使用 round 函数进行四舍五入,并注意数组索引从0开始。
    • 边界处理:确保计算出的位置不会超出数组的范围。

工具运用

  • AI 辅助功能:借助豆包MarsCode的代码自动补全和错误提示功能,可以加速调试过程,减少低级错误,提升编码效率。
  • 题解分析:同一个问题的解法可以有多种,自己想到的思路在时间、空间复杂度上不那么完美,可以与豆包提供的思路进行互补、优化改善。尤其是遇到较为复杂题目时,参考AI的解题方法有时候会获得意想不到的解题方式或者自己不知道的现成的函数。