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> // 創建一個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;
	}

}

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