java日志统计_Java实现蓝桥杯日志统计

标题:日志统计

小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有N行。其中每一行的格式是:

ts id

表示在ts时刻编号id的帖子收到一个"赞"。

现在小明想统计有哪些帖子曾经是"热帖"。如果一个帖子曾在任意一个长度为D的时间段内收到不少于K个赞,小明就认为这个帖子曾是"热帖"。

具体来说,如果存在某个时刻T满足该帖在[T, T+D)这段时间内(注意是左闭右开区间)收到不少于K个赞,该帖就曾是"热帖"。

给定日志,请你帮助小明统计出所有曾是"热帖"的帖子编号。

【输入格式】

第一行包含三个整数N、D和K。

以下N行每行一条日志,包含两个整数ts和id。

对于50%的数据,1 <= K <= N <= 1000

对于100%的数据,1 <= K <= N <= 100000 0 <= ts <= 100000 0 <= id <= 100000

【输出格式】

按从小到大的顺序输出热帖id。每个id一行。

【输入样例】

7 10 2

0 1

0 10

10 10

10 1

9 1

100 3

100 3

【输出样例】

1

3

资源约定:

峰值内存消耗(含虚拟机) < 256M

CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

不要使用package语句。不要使用jdk1.7及以上版本的特性。

主类的名字必须是:Main,否则按无效代码处理。

package 第七次模拟;

import java.util.Arrays;

import java.util.Scanner;

public class Demo12日志统计 {

public static void main(String args[]) {

int n, d, k; // 输入的N行每行一条日志,包含两个整数ts 和id。

Scanner sc = new Scanner(System.in);

n = sc.nextInt();

d = sc.nextInt();

k = sc.nextInt();

ClickHot arr[] = new ClickHot[n];

for (int i = 0; i < n; i++) {

int time = sc.nextInt();

int id = sc.nextInt();

arr[i] = new ClickHot(time, id); // 存放每组数字

}

Arrays.sort(arr); // 对其进行排序

int parentId = arr[0].id; // 先拿到第一个id

boolean flag =false; // 设置一个标志

for (int i = 0; i < n; i++) {

// 我当前得id如果有k个赞得话,就是热帖

// 当前位置和以后的k个位置上都是此id,就有k个赞

// 并且时间差小于d,并且没有被输出过

if (i + k - 1 < n && arr[i + k - 1].id == parentId && arr[i + k - 1].ts - arr[i].ts < d && !flag )

{

System.out.println(parentId); // 输出这个id 因为题目中只要求输出在同一个时间段有两个赞即可

flag = true;// 这步设置变量,当后面来相同的,但是我不需要输出了,因为两个已经够了

} else if (arr[i].id != parentId) // 这步是如果我不相同id值,那么我就把这个当前的id用我现在i数组中对应的id取代

{

parentId = arr[i].id; // 把先前的id替换

flag = false; // 重新设置标志

i = i - 1; // 因为我把上面一个设置了,此时我需要向上减一,然后再做比较,这样相当于我开始时候i不做变换没我把该取代的值取代掉

}

}

}

}

class ClickHot implements Comparable // 创建一个ClickHot类留存放两个每次的两个数字 一个是

// ts 是td

{

int ts, id;

ClickHot(int ts, int id) // 两个变量

{

this.ts = ts;

this.id = id;

}

@Override

public int compareTo(ClickHot o) {

if (id == o.id) // 先对id做比较其次id相同对ts做比较

return ts - o.ts;

else

return id - o.id;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值