筆試解題:5騰訊筆試題:統計論壇在線人數分佈

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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章