题目:在操作系统中,有一种虚拟内存管理技术是先进先出(FIFO)缓存,当所请求的存储页面不在缓存中或者缓存已满,应该从缓存中移除持续时间最长的页面,以腾出空间给更多请求的页面。如果缓存未满,那么可以简单的将请求的页面添加到缓存。给定的页面应在缓存中最多出现一次。当请求某个页面而在缓存中未找到此页面时发生缓存未命中。
给定缓存的最大尺寸和页面请求列表,计算缓存未命中数。
输入:
方法的输入包含两个参数 max_cache_size表示最大缓存尺寸的整数。数据在1-50之间。
paga_requests,表示len个页面的页面请求的整数列表。
输出:
返回一个表示缓存未命中的正整数。
测试用例:
输入:2 , [1,2,1,3,1,2]
输出:5
输入:3, [7.0.1.2.0.3.0.4.2.3.0.3.2.1.2.0]
输出:12
输入:2, [2,3,1,3,2,1,4,3,2]
输出:7
最开始的想法是用一个ArrayList做,但是通过率只有80%,也不知道是哪儿错了。
后来决定用队列做,其实应该用队列的,毕竟都是FIFO的机制。但是队列做的时候开始也只通过了90%,后来想到应该判断一下边界条件,所以就AC了。
public class ZTE_FIFO {
public static void main(String[] args) {
int a=2;
int []arr={1,2,1,3,1,2};
System.out.println(countCacheMiss(a,arr));
}
public static int countCacheMiss(int max_cache_size,int [] page_requests){
Queue<Integer> queue=new LinkedList<Integer>();
int num=0;
for(int i=0;i<page_requests.length;i++){
int key=page_requests[i];
if(!queue.contains(key)){
if(queue.size()<max_cache_size){
queue.offer(key);
}else{
queue.poll();
queue.offer(key);
}
num++;
}
}
return num;
}
}