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;
}
}