1. 程式人生 > 遊戲攻略 >《Valheim英靈神殿》室內裝潢佈置參考

《Valheim英靈神殿》室內裝潢佈置參考

題目描述

設計LRU快取結構,該結構在構造時確定大小,假設大小為K,並有如下兩個功能

  • set(key, value):將記錄(key, value)插入該結構
  • get(key):返回key對應的value值

[要求]

  1. set和get方法的時間複雜度為O(1)
  2. 某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。
  3. 當快取的大小超過K時,移除最不經常使用的記錄,即set或get最久遠的。

若opt=1,接下來兩個整數x, y,表示set(x, y)
若opt=2,接下來一個整數x,表示get(x),若x未出現過或已被移除,則返回-1
對於每個操作2,輸出一個答案

示例1

輸入

[[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3

返回值

[1,-1]

說明

第一次操作後:最常使用的記錄為("1", 1)
第二次操作後:最常使用的記錄為("2", 2),("1", 1)變為最不常用的
第三次操作後:最常使用的記錄為("3", 2),("1", 1)還是最不常用的
第四次操作後:最常用的記錄為("1", 1),("2", 2)變為最不常用的
第五次操作後:大小超過了3,所以移除此時最不常使用的記錄("2", 2),加入記錄("4", 4),並且為最常使用的記錄,然後("3", 2)變為最不常使用的記錄

備註:

題目連結:https://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61?tpId=117&tqId=37804&rp=1&ru=%2Fta%2Fjob-code-high&qru=%2Fta%2Fjob-code-high%2Fquestion-ranking&tab=answerKey

每一次是個3元組或者是2元組,{1,2,3],第一個元素1表示是set操作,{2,3}這裡的第一個元素2表示get操作。

class Solution {
public:
    /**
     * lru design
     * @param operators int整型vector<vector<>> the ops
     * @param k int整型 the k
     * @return int整型vector
     */
    vector<int> LRU(vector<vector<int> >& operators, int k) 
    {
        vector<int> key;
        vector<int> value;
        vector<int> res;
        for(int i=0;i<operators.size();++i)
        {
            if(operators[i][0]==1)//set操作
            {
                set(operators[i][1],operators[i][2],key,value,k);
            }
            else
            {
                get(operators[i][1],key,value,res);
            }
        }
        return res;//返回值別忘了
    }
    //set就是設定(key,value),能放就壓入,放不下就把頭的刪除出去,調整是get的要做的事,set不用管那麼多
    void set(int k,int v,vector<int>&key,vector<int>&value,int&Knum)
    {
        if(key.size()<Knum)
        {
            key.emplace_back(k);
            value.emplace_back(v);
        }
        else
        {
            key.erase(key.begin());
            value.erase(value.begin());
            key.emplace_back(k);
            value.emplace_back(v);
        }
    }
    void get(int k,vector<int>&key,vector<int>&value,vector<int>&res)
    {//get需要把這次用到的頁面調整到最後面的位置
        int pos=-1;
        for(int i=0;i<key.size();++i)
        {
            if(key[i]==k)
            {
                pos=i;
                break;
            }
        }
        if(pos==-1)
        {
            res.emplace_back(-1);
        }
        else
        {
            int tmpKey=key[pos],tmpValue=value[pos];//先臨時記錄下來再刪除
            key.erase(key.begin()+pos);
            value.erase(value.begin()+pos);
            key.emplace_back(tmpKey);
            value.emplace_back(tmpValue);
            res.emplace_back(tmpValue);
        }
    }
};