华为od机试C卷【文件缓存系统】

目录

题目

思路

code


题目

请设计一个文件缓存系统,该文件缓存系统可以指定缓存的 最大值 (单位为字节)

文件缓存系统有两种操作: 存储文件(put)和 读取文件 (get)

操作命令为put fileName fileSize或者get fileName

存储文件是把文件放入文件缓存系统中;读取文件是从文件缓存系统中访问已存在的文件,如果文件不存在,则不作任何操作。

当缓存空间不足以存放新的文件时,根据规则删除文件,直到剩余空间满足新的文件大小为止,再存放新文件。具体的删除规则为: 文件访问过后,会更新文件的最近访问时间和总的访问次数,当缓存不够时,按照第一优先顺序为访问次数从少到多,第二顺序为时间从老到新的

除文件。

输入描述: 第一行为缓存 最大值 m(整数,取值范围为0 < m <= 52428800);

第二行为 文件操作序列个数n(0 <= n <= 300000)

从第三行起为文件操作序列,每个序列单独一行文件操作定义为"op file name file size"

file name是 文件名,file size是文件大小

输出描述

输出当前文件缓存中的文件名列表,文件名用英文逗号分隔,按字典顺序排序如:

a,c

如果文件缓存中没有文件,则输出NONE

补充说明:

1.如果新文件的文件名和文件缓存中已有的文件名相同,则不会放在缓存中

2.新的文件第一次存入到文件缓存中时,文件的总访问次数不会变化,文件的最近访问时间会更新到最新时间

3.每次文件访问后,总访问次数加1,最近访问时间更新到最新时间

4.任何两个文件的最近访问时间不会重复

5.文,均为小写件名不会为空字母,最大长度为10。

6.缓存空间不足时,不能存放新文件

7.每个文件大小都是大于0的整数

示例1

输入:

50

6

put a 10

put b 20

get a

get a

get b

put c 30

输出:

a,c

示例2

输入:

50

1

get file

输出:

NONE

思路

code

var fn = function (capacity, N, cmds) {
    let files = new Map();
    let getFile = (fileName) => {

        if (files.has(fileName)) {

            let obj = files.get(fileName);

            obj.visit += 1;
            obj.lastUpdateDate = Date.now();
        }

    }

    let getSpace = () => {

        let sum = 0;
        for (const it of files.entries()) {
            sum += it[1].size
        }
        return N - sum;

    }

    let release = () => {
        let arr = [];
        for (const it of files.entries()) {
            arr.push({ fileName: it[0], visit: it[1].visit, lastUpdateDate: it[1].lastUpdateDate });
        }
        arr.sort((a, b) => {
            if (a.visit == b.visit) {
                return b.lastUpdateDate - a.lastUpdateDate
            } else {
                return a.visit - b.visit
            }
        });

        if (arr.length > 0) {
            let top = arr[0];
            files.delete(top.fileName);
        }

    }
    let putFile = (fileName, size) => {
        if (N < size) {
            return
        }
        if (!files.has(fileName)) {
            if (getSpace() >= size) {
                let obj = {};
                obj.visit = 0;
                obj.lastUpdateDate = Date.now();
                obj.size = size;
                files.set(fileName, obj);
            } else {

                do {
                    release();

                } while (getSpace() < size);
                let obj = {};
                obj.visit = 0;
                obj.lastUpdateDate = Date.now();
                obj.size = size;
                files.set(fileName, obj);

            }

        }

    }


    for (let i = 0; i < N; i++) {
        const element = cmds[i].split(" ");
        if (element.length == 2) {
            getFile(element[1])
        } else {
            putFile(element[1], [2])
        }


    }

    console.log(files);

}

fn(50, 6, ["put a 10", "put b 20", "get a", "get a", "get b", "put c 30"])
fn(50,1,["get file"])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值