问题描述:
样例如下:
代码如下:两种思路
import java.util.*;
public class RecentCounter {
//最近的请求次数
//方法一
List<Integer> list=new LinkedList<>();
HashSet<Integer> hashSet=new HashSet<>();//利用hashset来加速查重
int count=0;
public RecentCounter() {//构造器
this.count=0;
}
public int ping(int t) {
this.list.add(t);
hashSet.add(t);
if (t-3000<=list.get(0)) return list.size();//剪枝
if (list.size()>2)
if (t-3000>list.get(list.size()-2)) return 1;
if (!hashSet.contains(t-3000))//包含与不包含的情况是不相同的
return this.list.size()-binarySearch(this.list,0,this.list.size()-1,t-3000)-1;
else return this.list.size()-binarySearch(this.list,0,this.list.size()-1,t-3000);
}
//二分查找来查找t-300 的位置
public int binarySearch(List<Integer> list,int st,int end,int t){//此处t表示为t-300的含义
while (st<=end){
int mid=(st+end)>>1;
if (list.get(mid)<t) st=mid+1;
else if (list.get(mid)>t) end=mid-1;
else return mid;
}
return end;
}
//方法二 使用队列的方法进行
//首先 将元素加入到队列中 ,然后从头部不断地弹出小于t-3000的元素即可,最后输出队列的长度
class RecentCounter1 {
Queue<Integer> queue;
public RecentCounter1() {
queue = new ArrayDeque<Integer>();
}
public int ping(int t) {
queue.offer(t);
while (queue.peek() < t - 3000) {
queue.poll();
}
return queue.size();
}
}
public static void main(String[] args) {
RecentCounter recentCounter=new RecentCounter();
Scanner scanner=new Scanner(System.in);
while (true){
System.out.println("请输入t");
int t=scanner.nextInt();
System.out.println("结果为 "+recentCounter.ping(t));
System.out.println("list中的内容为 "+recentCounter.list.toString());
}
}
}
运行结果如下: