题目描述:
输入最大缓存个数max_cache_size和页面申请数组page_requests,请求进入时的缓存状态,按留在缓存中最长时间到留在缓存中最短时间排序。输出未命中页面个数。
例如:
输入:
max_cache_size: 2
page_requests:[1, 2, 1, 3, 1, 2]
输出:
5。
作者解释:这其实是先进先出页面置换算法,来求未命中个数。
作者设计:用一个vector容器来模拟队列,外层是一个大循环,指针指向数组第一个元素,知道指向最后一个元素为止,循环结束。循环内部有两个if判断。先判断队列是否为空,若为空,则压入元素,未命中加1;若不为空,则用find()函数查找该元素是否在队列中,若不在,未命中加1,这时候再做一次判断,队列是否已满,若满,先弹出队头元素,再在队尾压入元素;否则直接压入。若在,则继续循环。
代码如下所示:
# include <iostream>
# include <vector>
# include <algorithm>
using namespace std;
int getMissNum(const vector<int> &nums, const unsigned int &n)
{
if (n <= 0 || nums.empty())
return 0;
vector<int> Q;
int cnt = 0;
for (unsigned int i = 0; i < nums.size(); ++i)
{
if (Q.empty())
{
Q.insert(Q.begin(), nums[i]);
cnt ++;
}
else
{
if(find(Q.begin(), Q.end(), nums[i]) == Q.end())
{
cnt ++;
if(Q.size() == n)
{
Q.pop_back();
Q.insert(Q.begin(), nums[i]);
}
else
{
Q.insert(Q.begin(), nums[i]);
}
}
}
}
return cnt;
}
int main(void)
{
int nums_temp1[] = {1, 2, 1, 3, 1, 2};
int nums_temp2[] = {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0};
int nums_temp3[] = {2, 3, 1, 3, 2, 1, 4, 3, 2};
vector<int> nums1(nums_temp1, nums_temp1 + 6);
vector<int> nums2(nums_temp2, nums_temp2 + 16);
vector<int> nums3(nums_temp3, nums_temp3 + 9);
cout << "case1, missNum is " << getMissNum(nums1, 2) << endl;
cout << "case2, missNum is " << getMissNum(nums2, 3) << endl;
cout << "case3, missNum is " << getMissNum(nums3, 2) << endl;
return 0;
}
代码中用到了find()函数,所以需要加上头文件# include 。
vector模拟队列是用insert()和pop_back()两个函数实现的,即压入元素insert(Q.begin(), nums[i]),弹出元素pop_back()。
程序中的测试用例均来自中兴官方测试平台。
若有不对之处,敬请指正。