天天看點

LintCode-538: Memcache (System Design題)

這道題目主要考驗hashmap的應用。記得node.timeout = curtTime + ttl - 1; //這裡要-1.

class Memcache {
public:
    class Node {
        public:
            Node(int v = , int t = ) : value(v), timeout(t) {}
            int value;
            int timeout;
    };

    /*
     * @param curtTime: An integer
     * @param key: An integer
     * @return: An integer
     */
    int get(int curtTime, int key) {
        if ((hashmap.find(key) == hashmap.end()) || 
            ((curtTime > hashmap[key].timeout) && (hashmap[key].timeout > ))) {
            return INT_MAX;
        }

        return hashmap[key].value;    
    }

    /*
     * @param curtTime: An integer
     * @param key: An integer
     * @param value: An integer
     * @param ttl: An integer
     * @return: nothing
     */
    void set(int curtTime, int key, int value, int ttl) {
        Node node(value, );

        //if ttl = 0, timeout is already set as 0 in default constructor.
        if (ttl != ) {
            node.timeout = curtTime + ttl - ;
        }

        hashmap[key] = node;
    }


    /*
     * @param curtTime: An integer
     * @param key: An integer
     * @return: nothing
     */
    void del(int curtTime, int key) {
        if (hashmap.find(key) != hashmap.end()) {
            hashmap.erase(key);
        }
    }

    /*
     * @param curtTime: An integer
     * @param key: An integer
     * @param delta: An integer
     * @return: An integer
     */
    int incr(int curtTime, int key, int delta) {
        if (hashmap.find(key) == hashmap.end()) 
            return INT_MAX;

        if ((curtTime > hashmap[key].timeout) && (hashmap[key].timeout > ))
            return INT_MAX;

        hashmap[key].value += delta;
        return hashmap[key].value;
    }

    /*
     * @param curtTime: An integer
     * @param key: An integer
     * @param delta: An integer
     * @return: An integer
     */
    int decr(int curtTime, int key, int delta) {
        if (hashmap.find(key) == hashmap.end()) 
            return INT_MAX;

        if ((curtTime > hashmap[key].timeout) && (hashmap[key].timeout > ))
            return INT_MAX;

        hashmap[key].value -= delta;
        return hashmap[key].value;
    }

private:
    map<int, Node> hashmap;  
};