网易开发暑期实习笔试4.16
问答题:
(就是牛客的面试宝典!!!题目相似,不是原话)
假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),
请你统计最热门的10个查询串,要求使用的内存不能超过1G。
答:
问题解析:
要统计最热门查询,首先就是要统计每个Query出现的次数,然后根据统计结果,找出Top 10。所以我们可以基于这个思路分两步来设计该算法。
第一步:Query统计 维护一个Key为Query,Value为该Query出现次数的HashTable,每次读取一个Query,如果该字串不在Table中,那么加入该字串,并且将Value值设为1;
如果该字串在Table中,那么将该字串的计数加一即可。最终我们在O(N)的时间复杂度内完成了对该海量数据的处理。
第二步:找出Top 10 (找出出现次数最多的10个)
维护一个K(该题目中是10)大小的小根堆,然后遍历300万的Query,分别和根元素进行对比。
总结:
先用Hash表统计每个Query出现的次数,O(N);然后第二步、采用堆数据结构找出Top 10,N*O(logK)。
所以,我们最终的时间复杂度是:O(N) + N‘*O(logK)。(N为1000万,N’为300万)。
算法题:
打印大小为N的O字母,长宽都为4n(大佬的答案)
只看了2个
一个区间的权值为区间内所有数的乘积末尾0的数量,求所有区间权值之和 (自己测了几个都是对的)
public class test1 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int[] arr=new int[n]; for(int i=0;i<n;i++){ arr[i]=scan.nextInt(); } int count=0; int res=0; int m; for(int i=0;i<n;i++){ res=arr[i]; if(res%10==0){ while(res!=0){ m = res%10;//得到最后一位数字赋值给m if(m==0){count++;} else{ break; } res = res/10; } } } int a=0; for(int i=0;i<n-1;i++){ for(int j=i+1;j<n;j++){ res=1; a=i; while(a<=j){ res*=arr[a]; a++; } if(res%10==0){ if(res%10==0){ while(res!=0){ m = res%10;//得到最后一位数字赋值给m if(m==0){count++;} else{ break;} res = res/10; } } } } } System.out.println(count); } }