5腾讯笔试题:统计论坛在线人数分布
求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。
x坐标长度:
时间以秒为单位,则
x坐标长为24*60*60=86400
y坐标长度:
2亿个用户,则y坐标最长为2亿,int最大是21亿,可用int计算。
以数组ar统计:
int [] ar = new int[86400];
因为日志是以时间为顺序写入的,所以可以假设不存在,前一条记录比后一条时间要前,即超前的时候当作是上一条的时间。那么n+1秒的是n秒的减去登出的l,加上登入的k。则
ar[n+1]=ar[n]-m+k
m为这一秒登入的,
k为这一秒拿出的,
当n=0时,ar[0]=0-m+k.
编写代码如下:
package com.chruan.test;
public class Online {
private static final int LOGIN = 0;
public static void main(String[] args) {
statOnline();
}
/**
* 统计论坛在线人数分布
* @return
*/
public static int[] statOnline() {
int[] ar = new int[86400];
int lasttime = -1;
int onlineNum = 0;
int idx = 0;
int max=24*60*60;//86400;//以秒为单位
while (true) {
if (idx >= max) {//到最后
ar[max-1] = onlineNum;
break;
}
int time = readTimeSec();// 已转为[0-86400]
int log = readLog();//login or logout
while (idx < time) {// 这段时间在线人数不变
ar[idx++] = onlineNum;
}
if (time > lasttime) {// 不是当前秒了。
if (idx == 0) {
onlineNum = 0;
} else
onlineNum = ar[idx - 1];
lasttime = time;
}
if (log == LOGIN) {// 计算登入
onlineNum++;
} else {
onlineNum--;
}
idx++;
}
return ar;
}
private static int readTimeSec() {
return 0;
}
}