题目解析
题目描述:
西瓜视频正在开发一个新功能,旨在将访问量达到80百分位数以上的视频展示在首页的推荐列表中。实现一个程序,计算给定数据中的80百分位数。
例如:假设有一个包含从1到100的整数数组,80百分位数的值为80,因为按升序排列后,第80%位置的数字就是80。
99 百分位数:假如有 N 个数据,将数据从小到大排列,99 百分位数是第N×99%位置处的数据(遇到小数时四舍五入获取整数)。一般计算逻辑是先排序,定位到 N×99%的位置。返回该位置处的数据。同理,80 百分位数就是第 N×80%位置处的数据。
思维详解:
由题意可得,该题需要将给定数字进行排序,后进行80百分位数计算。题意简单明晰,但难度为中,显然这不是该题考察的重点。此题的“困难”之处在于输入数据格式的特殊,其给定的数据并非排序常用的数组,而是数字逗号交织的字符串,如何对此进行排序且使得代码简介清晰才是该题考核关键。相信绝大多数人的第一反应是这题好麻烦,需要进行很多麻烦的条件判断以及双重嵌套循环去计算字符串各个数位,再将其进行整合形成整型数字,最后归入数组进行排序。但是,java中的很多包装好的函数可以很好的规避掉此类的不便。下面我将使用java进行解题。
代码详解:
首先使用i与j记录字符串遍历首尾,进而进行数字合法性判断,保证数组的单项一次性遍历,时间复杂度为O(n),在此期间如果i与j位置之间字符串符合整型数字定义,首先使用substring对字符串进行截取,再使用Integer.valueOf函数直接对截取下来的字符串进行识别,转换成整型数字之后加入链表numList。如此一来,即实现了动态存储空间分配,也避免了进行反向嵌套循环去对数位进行逐位计算。最后对列表进行排序,再进行访问召回即可。最终时间复杂度为O(n*logn)。
import java.util.*;
public class Main {
public static int solution(String data) {
// Please write your code here
ArrayList<Integer> numList=new ArrayList<>();
int i=0;
int j=0;
int loc=0;
while(true)
{
if(j>=data.length())
{
numList.add(Integer.valueOf(data.substring(i,j)));
break;
}
else
{
if(data.charAt(j)!=',')
{
j++;
}
else
{
numList.add(Integer.valueOf(data.substring(i,j)));
j++;
i=j;
}
}
}
Collections.sort(numList);
loc=(int)(Math.round(numList.size()*0.8)-1);
return numList.get(loc);
}
public static void main(String[] args) {
// You can add more test cases here
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);
}
}
知识总结
本题考的不是思维,因为题意哪怕是c语言初学者也看得懂,其考察的是解题者对语言封装函数的熟练应用。编程不能只会思维,合适的解题工具也必不可少。
学习计划
豆包MarsCode AI在我的刷题过程中给了我很大的帮助,千里之行始于足下,解题第一步就是读懂题,AI助手很好的为我明晰了题目要义。并且在解题过程中,AI助手也可以为我实时分析代码逻辑与漏洞,以防编程过程中的逻辑模糊现象,大大提升了解题效率。
工具运用
这里建议其他码友在题意不明时询问豆包AI,让其进行读题,明确题意。代码编程卡顿时借助AI对现有代码进行逻辑分析,获取接下来的解题思路,可有效提升效率,但要注意AI不是万能的,不能全部照抄,要融入自己的理解,才能获得最精确的题解。同时,如果发现代码于某些样例存在问题,可询问豆包AI当前代码是否存在边界问题没有考虑到。