目录
题目
请设计一个文件缓存系统,该文件缓存系统可以指定缓存的 最大值 (单位为字节)
文件缓存系统有两种操作: 存储文件(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"])