中兴编程题--获取未命中个数

原创 2016年08月31日 15:56:02

题目描述:
输入最大缓存个数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()。
程序中的测试用例均来自中兴官方测试平台。
若有不对之处,敬请指正。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

程序员面试题精选100题(22)-整数二进制表示中1的个数[算法]

题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过...

程序员面试题精选100题(22)-整数二进制表示中1的个数[算法]

题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道...

轻便的AOP编程框架-PostSharp (参数获取)

http://www.cnblogs.com/techmango/archive/2011/05/23/postsharp_light_weight_aop_framwork.html ...

android-关于socket编程(附上如何获取安卓机的ip)

学习了一下关于socket编程。 在安卓上面,socket编程分为两种,TCP和UDP,至于这两种有什么区别, TCP:面向连接的,安全的,速度慢,会反馈确定收到的 UDP:不链接的,不安全的,速度快...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)