由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - C++高手看下这个LC的LRU Cache的实现
相关主题
大家帮忙看看这个4sum怎么就不对C++ Q56: map & typedef (C29)
谁来解释下hashtable的iterator是怎么实现的狗家面经
LRU Cache, 请问, 如果我这样写,错误在哪里?为什么会time limit exceeded? 谢谢请问pure storage 的那道map 数据结构题
软件实现LRU有什么困难么Google Phone Interview
c++ 实现 LRU cache。贴一个google 面题
ebay二轮电面面经问个amazon的题目
都来说说leetcode上无聊恶心的题吧总结一下面试(CS related)的准备活动,希望有帮助.
贡献个regular expression DP解法请教一道Google面试题
相关话题的讨论汇总
话题: int话题: key话题: result话题: mcapacity
进入JobHunting版参与讨论
1 (共1页)
r****7
发帖数: 2282
1
可以pass所有的test cases,不知道是不是显得比较初级,本人C++比较普通,谢谢指
教!
class LRUCache{
public:
typedef map::iterator> > KVType;
LRUCache(int capacity) {
mCapacity = capacity;
}

int get(int key) {
KVType::iterator it = mKeyValuePair.find(key);
if (it == mKeyValuePair.end()) {
return -1;
}
int result = it->second.first;
list::iterator keysIt = it->second.second;
mKeys.erase(keysIt);
mKeys.push_front(key);
mKeyValuePair[key] = make_pair(result, mKeys.begin());
return result;
}

void set(int key, int value) {
int result = get(key);
// already exists
if (result != -1) {
mKeyValuePair[key].first = value;
return;
}
// doesn't exists and not full
if (mKeys.size() != mCapacity) {
mKeys.push_front(key);
mKeyValuePair[key] = make_pair(value, mKeys.begin());
return;
}
// doesn't exists and full
mKeyValuePair.erase(mKeys.back());
mKeys.pop_back();
mKeys.push_front(key);
mKeyValuePair[key] = make_pair(value, mKeys.begin());
}
private:
list mKeys;
KVType mKeyValuePair;
int mCapacity;
};
a*****u
发帖数: 1712
2
请问你的mKeys,pop_back()和push_front()的时间复杂度多少?如果不是O(1), 可以
考虑换成double linkedlist
a*****u
发帖数: 1712
3
查了下,list的操作时间的确是O(1), 那整体设计没啥大问题。至于语言让懂c++的人
看吧
r****7
发帖数: 2282
4
算法应该没啥问题,这个题也没啥算法吧,所以想让高手看看C++怎么写比较
sophisticated

【在 a*****u 的大作中提到】
: 查了下,list的操作时间的确是O(1), 那整体设计没啥大问题。至于语言让懂c++的人
: 看吧

e***i
发帖数: 231
5
looks good! my 2cents in comments:
class LRUCache{ // maybe it's better to be templated key instead of 'int'?
public:
typedef map::iterator> > KVType; // map O(lgn)
vs unordered_map O(n) ??
LRUCache(int capacity) {
mCapacity = capacity;
}

int get(int key) {
KVType::iterator it = mKeyValuePair.find(key); //auto it = ...
if (it == mKeyValuePair.end()) {
return -1;
}
int result = it->second.first;
mKeys.erase(it->second.second); // keysIt used only once, combine
the line above
mKeys.push_front(key);
mKeyValuePair[key] = make_pair(result, mKeys.begin());
return result;
}

void set(int key, int value) {
int result = get(key); //to optimise, maybe copy the first 3 lines
in get() instead of calling get()
// since you're putting the kv on top (push_front) anyway later here.
// already exists
if (result != -1) {
mKeyValuePair[key].first = value;
return;
}
if (mKeys.size() == mCapacity) {
// doesn't exists and full
mKeyValuePair.erase(mKeys.back());
mKeys.pop_back();
}
// doesn't exists and not full
mKeys.push_front(key);
mKeyValuePair[key] = make_pair(value, mKeys.begin());
}
private:
list mKeys;
KVType mKeyValuePair;
int mCapacity; // make it const, and init with ctor; and, unsigned int
};

【在 r****7 的大作中提到】
: 可以pass所有的test cases,不知道是不是显得比较初级,本人C++比较普通,谢谢指
: 教!
: class LRUCache{
: public:
: typedef map::iterator> > KVType;
: LRUCache(int capacity) {
: mCapacity = capacity;
: }
:
: int get(int key) {

1 (共1页)
进入JobHunting版参与讨论
相关主题
请教一道Google面试题c++ 实现 LRU cache。
Amazon的LRU设计题ebay二轮电面面经
怎么设计分布式LRU cache?都来说说leetcode上无聊恶心的题吧
面试题贡献个regular expression DP解法
大家帮忙看看这个4sum怎么就不对C++ Q56: map & typedef (C29)
谁来解释下hashtable的iterator是怎么实现的狗家面经
LRU Cache, 请问, 如果我这样写,错误在哪里?为什么会time limit exceeded? 谢谢请问pure storage 的那道map 数据结构题
软件实现LRU有什么困难么Google Phone Interview
相关话题的讨论汇总
话题: int话题: key话题: result话题: mcapacity