笔试解题: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;
	}
}


 

你可能感兴趣的:(面试笔试)