2016头条校招笔试题(LRU)算法之JAVA实现

操作系统中可以使用LRU(Least Recently Used)内存淘汰旧数据的策略,如果内存需要加载新数据但空间不足,则会按照最近访问时间进行排序,并将最老的数据淘汰。假设现在内存空间大小为5,原本内存中没有数据,对内存中数据的访问顺序如下:1, 2, 5, 3, 4, 6,1, 4, 3, 6, 7, 8, 3, 9 问访问过程中发生缺页的次数是多少次? 

JAVA实现:

首先实现一个固定长度的集合队列

package com.itstyle.list;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;  

/**
 * 实现一个固定长度的集合队列
 * 在开发中,有时候我们会遇到这样的需求:
 * 对一个集合操作,提前为集合指定最大大小,在我们不断向集合中添加数据的时候,当数据内容超过最大值的时候,自动将最先入队的元素移除队列。
 * @param <E>
 */
public class LimitQueue<E> implements Queue<E> {  

    /**
     * 队列长度,实例化类的时候指定
     */
    private int limit;    

    Queue<E> queue = new LinkedList<E>();    

    public LimitQueue(int limit){
        this.limit = limit;
    }

    /**
     * 入队
     */
    @Override
    public boolean offer(E e){
        if(queue.size() >= limit){
            //如果超出长度,入队时,先出队
            queue.poll();
        }
        return queue.offer(e);
    }    

    /**
     * 出队
     */
    @Override
    public E poll() {
        return queue.poll();
    }    

    /**
     * 获取队列
     */
    public Queue<E> getQueue(){
        return queue;
    }    

    /**
     * 获取限制大小
     */
    public int getLimit(){
        return limit;
    }    

    @Override
    public boolean add(E e) {
        return queue.add(e);
    }    

    @Override
    public E element() {
        return queue.element();
    }    

    @Override
    public E peek() {
        return queue.peek();
    }    

    @Override
    public boolean isEmpty() {
        return queue.size() == 0 ? true : false;
    }    

    @Override
    public int size() {
        return queue.size();
    }    

    @Override
    public E remove() {
        return queue.remove();
    }    

    @Override
    public boolean addAll(Collection<? extends E> c) {
        return queue.addAll(c);
    }    

    @Override
    public void clear() {
        queue.clear();
    }    

    @Override
    public boolean contains(Object o) {
        return queue.contains(o);
    }    

    @Override
    public boolean containsAll(Collection<?> c) {
        return queue.containsAll(c);
    }    

    @Override
    public Iterator<E> iterator() {
        return queue.iterator();
    }    

    @Override
    public boolean remove(Object o) {
        return queue.remove(o);
    }    

    @Override
    public boolean removeAll(Collection<?> c) {
        return queue.removeAll(c);
    }    

    @Override
    public boolean retainAll(Collection<?> c) {
        return queue.retainAll(c);
    }    

    @Override
    public Object[] toArray() {
        return queue.toArray();
    }    

    @Override
    public <T> T[] toArray(T[] a) {
        return queue.toArray(a);
    }
}

执行方法:

package com.itstyle.list;

import java.util.ArrayList;
import java.util.List;

/**
 * 操作系统中可以使用LRU(Least Recently Used)内存淘汰旧数据的策略,如果内存需要加载新数据但空间不足,
 * 则会按照最近访问时间进行排序,并将最老的数据淘汰。假设现在内存空间大小为5,原本内存中没有数据,对内存中数据的访问顺序如下:
 * 1, 2, 5, 3, 4, 6,1, 4, 3, 6, 7, 8, 3, 9 问访问过程中发生缺页的次数是多少次?
 *
 */
public class LRU {
	public static void main(String[] args) {
		LimitQueue<String> list = new LimitQueue<String>(5);
		Integer[] array = new  Integer[]{1, 2, 5, 3, 4, 6,1, 4, 3, 6, 7, 8, 3, 9 };
		List<Integer> page = new ArrayList<Integer>();
		for(Integer i :array){
			if(list.contains(i.toString())){
				list.remove(i);
			}else{
				page.add(i);
			}
			list.offer(i.toString());
		}
		System.out.println("缺页数量"+page.size()+",缺页数据"+page.toString());
	}
}

最终执行结果:缺页数量10,缺页数据[1, 2, 5, 3, 4, 6, 1, 7, 8, 9]

时间: 2024-10-18 10:26:13

2016头条校招笔试题(LRU)算法之JAVA实现的相关文章

[经典面试题][暴风影音]暴风影音2014校招笔试题

合并两个已经排序的单链表为一个排序的单链表,相同内容只保留一个如:单链表a:1->2->3->4 单链表b:3->4->5 输出:1->2->3->4->5 具体参考:[LeetCode]21.Merge Two Sorted Lists /*--------------------------------------------- * 日期:2015-02-23 * 作者:SJF0115 * 题目: 合并排序链表 * 来源:暴风影音 * 博客: --

华硕校招笔试题:哪些语言可以实现java编译器?

问题描述 今天参加了华硕的校招笔试,java只有唯一的一题,说的是:下列哪些语言可以实现java编译器?A:CB:C#C:JAVAD:以上都可以请问各位大神们指导,应该选哪个?java编译器还可以用多种语言实现吗?跪求解答! 解决方案 解决方案二:应该都可以吧解决方案三:就是生成.class文件吧.是A->B的转换吧.是语言都可以.解决方案四:是的,都可以!解决方案五:引用2楼u011461314的回复: 就是生成.class文件吧.是A->B的转换吧.是语言都可以. 请问能详细解释一下吗?解

2014百度校招笔试题之动态链接库&amp;amp;静态链接库详解

1.什么是静态连接库,什么是动态链接库         静态链接库用通俗的话讲,静态库就是将代码编译到一个二进制文件下(通常扩展名为.LIB).然后客户端调用程序,只需要包含相关的.h文件及LIB库文件一起链接到exe文件中.可执行程序发布后,不再需要该.lib文件了. 动态链接库最终将编译出.lib与.dll文件. 注意.lib文件与上面的静态库虽然扩展名相同,但有本质的区别.动态库中的lib文件是动态库的引入库. 该引入库包含被DLL导出的函数和变量的"符号  名".而静态库中的.

经典算法(9) 从归并排序到数列的逆序数对(微软笔试题)

首先来看看原题 微软2010年笔试题 在一个排列中,如果一对数的前后位置与大小顺序相反 ,即前面的数大于后面的数,那么它们就称为一个逆序数对.一个排列中逆序的总数就称为这个排列的逆序 数.如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定 一数组,要求统计出该数组的逆序数对个数. 计算数列的逆序数对个数最简单的方便就最从前向后依 次统计每个数字与它后面的数字是否能组成逆序数对.代码如下: #include <stdio.h> int ma

java算法题,公司的笔试题

问题描述 java算法题,公司的笔试题 suppose you have N cakes, N is an interger>0 // at each time, you can either eat 1 cake, or 2 cakes or 3 cakes // PROBLEM: How many ways can you eat all N cakes // for example, N = 4, (1,2,1) and (1,1,2) are considered to be diffe

排序 list-360 笔试题 下列哪个算法是对一个list排序的最快方法()

问题描述 360 笔试题 下列哪个算法是对一个list排序的最快方法() 下列哪个算法是对一个list排序的最快方法() 快速排序 冒泡排序 二分插入排序 线性排序 解决方案 我认为,是冒泡 .... 解决方案二: 二分插入排序法. 楼主可以去看Collections.sort(list);的排序算法,就是用的二分插入排序. 解决方案三: 二分. 不过 这也要看情况的, 数据大小的不同 是不一样的,若list里边只有一个数据呢?两个呢?. 解决方案四: 同时你也可以去看看 STL 里边的 lis

算法-京东在线笔试题,关于排列组合的问题

问题描述 京东在线笔试题,关于排列组合的问题 考虑数字序列{1,3,4,2,6,7,5,5,8,10,9,10,7,17},任取其中几个数字相加,使得到的和为29, 则不同的组合有几种?(第2,第3,第7,第14个数的组合与第2,第3,第13,第14个数的 组合看起来是一样的,都是3,4,5,17,那么这里只视为一种) 解决方案 修正下,96种http://ideone.com/kNl4Mw using System; using System.Linq; using System.Collec

学生党如何拿到阿里技术offer: 《2016阿里巴巴校招内推offer之Java研发工程师(成功)》

大学里有这样一句话"现在流的泪,都是当初选专业是脑子进的水",从见闻中了解很多中学非常优秀的同学因为选择了自己不喜欢不感冒的专业,很多人不懂得为自己寻找方向,而是继续延续应试教育下的学习方式,这样,他们的学习便成为了"面向考试"的学习,当他们走出大学校门,往往会发现,自己出了成绩单上的几个数字之外收获甚少.   但其实学习的主动权就在自己手中,你不喜欢自己的专业,但是你可以为自己选择未来的路.在计算机互联网行业,不是科班出身但是取得辉煌成就的人大有人在,问及为什么不

C++笔试题汇总(45题)

本文转自:<程序员必看c++笔试题汇总>,经过整理正文如下: 本文通过对程序员笔试过程的总结,对程序员c++笔试题进行了汇总.希望能与大家共同分享.下面是一些常见题型: 1.求下面函数的返回值(微软) { int countx = 0; while(x) { countx ++; x = x&(x-1); } return countx; } 假定x = 9999. 答案:8 思路:将x转化为2进制,看含有的1的个数. 2. 什么是"引用"?申明和使用"引