思路:
- 利用map<Integer,ArrayList<Integer>>存储, 同一个id放入arrlist中并进行排序 后面再对排序的数组进行逻辑判断
- 逻辑判断部分:判断是否给定区间内有给定的赞的数量, 发现如果采用直接的计数,遍历的时候每个数前后很难判断谁在区间内, 所以采用间接的策略, 先在第一个数的基础上加上给定的区间(即end=arrayListId.get(0)+t), 当遍历到的值超过给定区间的时候, 则视作一次超过区间 最后再利用总数-超过区间的个数(即arrayListId.size()-count>=k)来判断是否达标
注意:
- hashset添加的元素时是无序添加的 如果想要多一个有序的功能可以用LinkHashSet
import java.util.*;
public class 日志统计 {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int t=scan.nextInt();//时间长度
int k=scan.nextInt();//k个赞
Set<Integer> setId=new LinkedHashSet<>();
Map<Integer,ArrayList<Integer>> map=new HashMap<>();
for(int i=0;i<n;i++) {
int ts = scan.nextInt();
int id = scan.nextInt();
setId.add(id);
if(map.containsKey(id)) {
map.get(id).add(ts);
}else {
ArrayList<Integer> arraylist=new ArrayList<>();
arraylist.add(ts);
map.put(id, arraylist);
}
}
//1:0 9 10
//10:0 10
//3:100 100
//遍历map中每条数据,获取map的key以便获取value
for(Integer id:setId) {
ArrayList<Integer> arrayListId = map.get(id);
Collections.sort(arrayListId);
int end=arrayListId.get(0)+t;
int count=0;
//遍历arraylist中所有的值
for(Integer tz:arrayListId) {
if(tz>=end) {
//找到所有不是在区间的个数
end=t+tz;
count++;
}
}
//总个数减去不是的个数
if(arrayListId.size()-count>=k) {
System.out.println(id);
}
}
}
}