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]


目录
相关文章
|
搜索推荐 算法 Java
2025 年互联网大厂校园招聘 JAVA 工程师笔试题及备考要点解析
本文针对互联网大厂校招Java工程师笔试题进行解析,涵盖基础知识、面向对象编程、数据结构与算法、异常处理及集合框架等核心内容。从数据类型、运算符到流程控制语句,从类与对象、继承多态到数组链表、排序算法,再到异常捕获与集合框架应用,结合实际案例深入剖析,助你系统掌握考点,提升应试能力。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
424 9
|
算法 Java 关系型数据库
校招 Java 面试基础题目解析及学习指南含新技术实操要点
本指南聚焦校招Java面试,涵盖Java 8+新特性、多线程与并发、集合与泛型改进及实操项目。内容包括Lambda表达式、Stream API、Optional类、CompletableFuture异步编程、ReentrantLock与Condition、局部变量类型推断(var)、文本块、模块化系统等。通过在线书店系统项目,实践Java核心技术,如书籍管理、用户管理和订单管理,结合Lambda、Stream、CompletableFuture等特性。附带资源链接,助你掌握最新技术,应对面试挑战。
267 2
|
SQL Java 数据库连接
java 校招需要准备哪些内容及关键要点解析
这是一篇针对Java校招准备的详细指南,涵盖六大核心板块:扎实的Java基础知识(如数据类型、面向对象编程、集合框架)、数据库相关知识(SQL操作与管理工具)、Java开发框架(Spring、Spring Boot、MyBatis)、其他重要知识(多线程编程、网络编程、数据结构与算法)、项目经验准备以及面试技巧。文章结合技术方案与应用实例,帮助应届生全面掌握校招所需技能,从理论到实践全面提升竞争力。资源地址:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
252 1
|
SQL Java 数据库连接
阿里腾讯互联网公司校招 Java 面试题总结及答案解析
本文总结了阿里巴巴和腾讯等互联网大厂的Java校招面试题及答案,涵盖Java基础、多线程、集合框架、数据库、Spring与MyBatis框架等内容。从数据类型、面向对象特性到异常处理,从线程安全到SQL优化,再到IOC原理与MyBatis结果封装,全面梳理常见考点。通过详细解析,帮助求职者系统掌握Java核心知识,为校招做好充分准备。资源链接:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
521 2
|
Java 数据库连接 API
互联网大厂校招 JAVA 工程师笔试题解析及常见考点分析
本文深入解析互联网大厂校招Java工程师笔试题,涵盖基础知识(数据类型、流程控制)、面向对象编程(类与对象、继承与多态)、数据结构与算法(数组、链表、排序算法)、异常处理、集合框架、Java 8+新特性(Lambda表达式、Stream API)、多线程与并发、IO与NIO、数据库操作(JDBC、ORM框架MyBatis)及Spring框架基础(IoC、DI、AOP)。通过技术方案讲解与实例演示,助你掌握核心考点,提升解题能力。
488 2
|
设计模式 算法 Java
2025 春季校招 Java 研发笔试题详细解析及高效学习指南
本指南专为2025春季校招Java研发岗位笔试设计,涵盖Java 17+新特性(如模式匹配、文本块、记录类和密封类)、现代技术栈(Spring Boot 3、响应式编程、Stream API增强)以及算法与数据结构实战。同时深入解析Spring Data JPA、事务管理、性能优化等内容,并结合实际案例讲解常见算法题解与设计模式应用。资源包含核心知识点、面试题及笔试技巧,助力高效备考。下载地址:[链接](https://pan.quark.cn/s/14fcf913bae6)。
290 1
|
存储 算法 Java
校招 java 面试基础题目及解析
本文围绕Java校招面试基础题目展开,涵盖平台无关性、面向对象特性(封装、继承、多态)、数据类型、关键字(static、final)、方法相关(重载与覆盖)、流程控制语句、数组与集合、异常处理等核心知识点。通过概念阐述和代码示例,帮助求职者深入理解并掌握Java基础知识,为校招面试做好充分准备。文末还提供了专项练习建议及资源链接,助力提升实战能力。
288 0
|
存储 算法 Java
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
359 0
|
Rust 算法 安全
【算法学习】1588. 所有奇数长度子数组的和(java / c / c++ / python / go / rust)
给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。 子数组 定义为原数组中的一个连续子序列。 请你返回 arr 中 所有奇数长度子数组的和 。
【算法学习】1588. 所有奇数长度子数组的和(java / c / c++ / python / go / rust)
|
Rust 算法 安全
【算法学习】剑指 Offer II 054. 所有大于等于节点的值之和|538|1038(java / c / c++ / python / go / rust)
给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下,二叉搜索树满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左右子树也必须是二叉搜索树。
【算法学习】剑指 Offer II 054. 所有大于等于节点的值之和|538|1038(java / c / c++ / python / go / rust)