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


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值