链表-设计LRU缓存结构

news2025/3/19 3:02:38

题目描述:

代码实现:这里记录了根据LRU算法原理最直接理解的代码实现。

import java.util.*;

//存储输入内容,记录访问权值
class CounterInfo {
    int key;
    int value;
    int times;//代表key对应的权值,值越小优先级越高
    public CounterInfo(int key, int value) {
        this.key = key;
        this.value = value;
        this.times = 0;
    }
}

public class Solution {
    ArrayList<CounterInfo> intarr;
    int maxsize;
    public Solution(int capacity) {
        // write code here
        intarr = new ArrayList<CounterInfo>(0);
        this.maxsize = capacity;
    }


    //除了key以外的元素都更新times++
    public void refreshTimes(int key) {
        Iterator infoit = intarr.iterator();
        while (infoit.hasNext()) {
            CounterInfo nowinfo = (CounterInfo)infoit.next();
            if (nowinfo.key != key) {
                nowinfo.times++;
            }
        }
    }


    /*
    1.遍历列表看是否存在key,如果存在则返回相应的value,如果不存在返回-1
    2.如果存在目标key,并且目标key对应权值不为0,更新目标key对应的权值为0,
      其他key对应权值都+1
    3.如果存在目标key,但是目标key对应权值为0,列表内所有权值不做改变
    */
    public int get(int key) {
        boolean isfind = false;
        boolean isrefresh = false;
        int resValue = -1;
        //查找intarr中是否存在key
        Iterator infoit = intarr.iterator();
        while (infoit.hasNext()) {
            CounterInfo nowinfo = (CounterInfo)infoit.next();
            if (nowinfo.key == key) {
                isfind = true;
                resValue = nowinfo.value;
                if (nowinfo.times != 0) {
                    isrefresh = true;
                    nowinfo.times = 0;
                } else {
                    isrefresh = false;
                }
            }
        }
        if (isfind) {
            if (isrefresh) {
                //更新其他info的times
                this.refreshTimes(key);
            }
            return resValue;
        } else {
            return -1;
        }
    }


    /*
    1.看是否存在key,如果存在更新key对应的value和权值=0
    2.如果不存在:
        2.1 列表满:选择权值最大的元素,修改key,value,权值=0;其他元素权值+1
        2.2 列表未满:列表添加新的CounterInfo对象;其他元素权值+1
    */
    public void set(int key, int value) {
        //先看是否存在
        boolean isfind = false;
        //查找intarr中是否存在key
        Iterator infoit = intarr.iterator();
        while (infoit.hasNext()) {
            CounterInfo nowinfo = (CounterInfo)infoit.next();
            if (nowinfo.key == key) {
                isfind = true;
                //更新value
                nowinfo.value = value;
                if (nowinfo.times != 0) {
                    nowinfo.times = 0;
                    this.refreshTimes(key);
                }
            }
        }

        if (!isfind) {
            //判断是否达到最大长度
            if (intarr.size() == maxsize) {
                //找到最久未访问的元素,更新key,value,times
                infoit = intarr.iterator();

                //找到最大time
                int maxtime = 0;
                while (infoit.hasNext()) {
                    CounterInfo nowinfo = (CounterInfo)infoit.next();
                    maxtime = maxtime > nowinfo.times ? maxtime : nowinfo.times;
                }

                //根据最大time更新key-value值
                infoit = intarr.iterator();
                while (infoit.hasNext()) {
                    CounterInfo nowinfo = (CounterInfo)infoit.next();
                    if (nowinfo.times == maxtime) {
                        nowinfo.times = 0;
                        nowinfo.key = key;
                        nowinfo.value = value;
                    }
                }
            } else {
                CounterInfo newinfo = new CounterInfo(key, value);
                intarr.add(newinfo);
            }
            this.refreshTimes(key);
        }

    }
}

/**
 * Your Solution object will be instantiated and called as such:
 * Solution solution = new Solution(capacity);
 * int output = solution.get(key);
 * solution.set(key,value);
 */

刷题链接:

设计LRU缓存结构_牛客题霸_牛客网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1694377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 自定义图片进度条

用系统的Progressbar&#xff0c;设置图片drawable作为进度条会出现图片长度不好控制&#xff0c;容易被截断&#xff0c;或者变形的问题。而我有个需求&#xff0c;使用图片背景&#xff0c;和图片进度&#xff0c;而且在进度条头部有个闪光点效果。 如下图&#xff1a; 找了…

用于时间序列概率预测的蒙特卡洛模拟

大家好&#xff0c;蒙特卡洛模拟是一种广泛应用于各个领域的计算技术&#xff0c;它通过从概率分布中随机抽取大量样本&#xff0c;并对结果进行统计分析&#xff0c;从而模拟复杂系统的行为。这种技术具有很强的适用性&#xff0c;在金融建模、工程设计、物理模拟、运筹优化以…

基于springboot+vue的招聘信息管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

大模型的灵魂解读:Anthropic AI的Claude3 Sonnet可解释性研究

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提供了大模型领域最新技…

【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

HarmonyOS开发之DevEco Studio安装

HUAWEI DevEco Studio是基于IntelliJ IDEA Community开源版本打造&#xff0c;为运行在HarmonyOS和OpenHarmony系统上的应用和服务&#xff08;以下简称应用/服务&#xff09;提供一站式的开发平台。 作为一款开发工具&#xff0c;除了具有基本的代码开发、编译构建及调测等功能…

Python高级进阶--slice切片

slice切片⭐⭐ 在 Python 中&#xff0c;切片操作是一种常见且方便的方式&#xff0c;用于从字符串、列表或元组中获取部分元素。这种操作通过指定起始索引、结束索引和步长来实现。下面我们来看一些关于切片的简单介绍以及一些常见用法。 1. 切片简介 取一个str、list、tup…

一文搞懂 Transformer(总体架构 三种注意力层)

本文将从Transformer的本质、Transformer_的原理_、_Transformer的应用__三个方面&#xff0c;带您一文搞懂Transformer&#xff08;总体架构 & 三种注意力层&#xff09;。 节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友…

出题123

题目时限空间说明 无特殊均默认 1 s , 256 M B 1s,256MB 1s,256MB Problem a 最大化 在最大化目标值的基础上选择的操作越多越好&#xff0c;且输出操作应当按照顺序执行&#xff0c;即你的输出顺序就是你的执行顺序&#xff0c;当有多个执行顺序可以最大化目标值时&#xff0…

GEE批量导出逐日、逐月、逐季节和逐年的遥感影像(以NDVI为例)

影像导出 1.逐日数据导出2.逐月数据导出3.季节数据导出4.逐年数据导出 最近很多小伙伴们私信我&#xff0c;问我如何高效导出遥感数据&#xff0c;从逐日到逐季度&#xff0c;我都有一套自己的方法&#xff0c;今天就来和大家分享一下&#xff01;   &#x1f50d;【逐日导出…

详解最新版RabbitMQ 基于RPM 方式的安装

如何选择安装版本 已经不支持的发布系列 版本最后补丁版本首次发布时间停止更新时间3.73.7.282017年11月28日2020年09月30日3.63.6.162015年12月22日2018年05月31日3.53.5.82015年03月11日2016年10月31日3.43.4.42014年10月21日2015年10月31日3.33.3.52014年04月02日2015年03…

Vivado报错集合

Synth 8-5535 报错代码 [Synth 8-5535] port <clk_0> has illegal connections. It is illegal to have a port connected to an input buffer and other components. The following are the port connections : Input Buffer:Port I of instance clkin1_ibufg(IBUF) i…

张大哥笔记:穷人都在拼命挣钱,而富人都在努力让自己更值钱

最近行业大佬&#xff0c;纷纷网红化&#xff0c;比如周鸿祎&#xff0c;雷军&#xff0c;刘强东纷纷下场&#xff01; 大佬当网红&#xff0c;图啥&#xff1f;当然是图钱了。 大佬都很精的&#xff0c;他们老早就运用媒体的传播杠杆&#xff0c;把自己热度炒起来。 在不断…

类和对象(下篇)(未完结)!

文章目录 在谈构造函数1.构造函数体赋值2.初始化列表尽量使用初始化列表&#xff1f;初始化列表的初始化顺序&#xff1f;成员变量声明处的缺省值构造函数支持类型转换3.explicit关键字 static成员 在谈构造函数 1.构造函数体赋值 class Date{public:Date(int year, int mont…

MATLAB:插值函数之interp与griddata

MATLAB 提供了多种插值函数来处理不同维度的数据。其中&#xff0c;interp1、interp2 和 griddata 是常用的插值函数&#xff0c;分别用于一维、二维和多维&#xff08;不规则&#xff09;数据的插值。 之前有对interp1进行过详细介绍&#xff0c;如需详细了解&#xff0c;请查…

【算法】决策单调性优化DP

文章目录 决策单调性四边形不等式决策单调性 形式1法1 分治法2 二分队列例题 P3515Solution 形式2例题 P3195Solution 形式3例题 CF833BSolution 形式4例题Solution 后话 决策单调性 四边形不等式 定义: 对于二元函数 w ( x , y ) w(x,y) w(x,y)&#xff0c;若 ∀ a , b , …

【Linux取经路】线程同步——条件变量

文章目录 前言一、条件变量1.1 pthread_cond_init——初始化一个条件变量1.2 pthread_cond_destroy——销毁一个条件变量1.3 定义一个全局的条件变量1.4 pthread_cond_wait——等待条件满足1.5 pthread_cond_signal——唤醒一个等待线程1.6 pthread_cond_broadcast——唤醒所有…

云界洞见:移动云服务开启技术创新与问题解决的新篇章

一、什么是移动云 移动云以“央企保障、安全智慧、算网一体、属地服务”为品牌支撑&#xff0c;聚焦智能算力建设&#xff0c;打造一朵智能、智慧、安全可信可控的云&#xff0c;提供更优质的算力服务&#xff0c;引领云计算产业发展。 那么下面博主带领大家了解移动云的优势所…

为什么建立数据库连接耗时?究竟耗时多久?

数据库连接从连接池中取这已经是大家的共识了&#xff0c;因为频繁的建立或者关闭连接代价太大&#xff0c;那么代价究竟有多大&#xff1f; 我们先准备一个简单的数据库连接代码段 public static void main(String[] args) throws ClassNotFoundException, SQLException, Int…

Aligned Layer:trustless应用的通用验证层

1. 引言 Aligned Layer近期获得了2000万美金的A轮融资&#xff0c;Aligned Layer&#xff1a; 致力于成为 去中心化 zero-knowledge (ZK) proof 验证层。旨在为不同证明系统&#xff0c;提供快速、经济且可扩展的零知识证明验证。作为以太坊生态系统及其他生态系统的通用sour…