给定常数x和t,写一个不带整数的函数 如果函数被调用x number,则返回true 最后t秒的时间。
这是我可能的算法的伪代码/ C ++实现,但我不确定它是否正确/有效:
const int x;
const int t;
vector<long> v;
boolean countNumberOfTimesBeenCalled(){
int numberOfCallsInLastTSeconds=0;
v.push_back(System.currentTimeInMillis());
for(int x=0; x<v.size();x++){
if((v.at(x)>=(System.currentTimeInMillis()-1000*t))&&(v.at(x)<=System.currentTimeInMillis())
numberOfCallsInLastTSeconds++;
}
if(numberOfCallsInLastTSeconds==x)
return true;
else
return false;
}
有人可以提出替代方案吗?
答案 0 :(得分:3)
您无需保留以前所有通话的完整日志;你只需要知道最后x次呼叫的持续时间。
const int x;
const int t;
bool have_we_made_enough_calls_lately() {
static deque<int> times;
times.push_back(current_time_in_msec());
if (times.size() > x)
times.pop_front();
return times.back() - times.front() <= 1000 * t;
}
编辑:在检查其他答案时,我意识到这个问题含糊不清。如果至少 x次调用(我假设的话)或完全 x次调用(其他人假设的话),您是否想要返回true是不明确的。
答案 1 :(得分:0)
bool calledXTimesInLastTSeconds() {
static deque<long> last_calls;
long time = currentTimeInMillis();
// clear last calls
long last_call_to_consider = time - 1000*t;
while (last_calls.front() < last_call_to_consider)
last_calls.pop_front()
last_calls.push_back(time);
return last_calls.size() == x;
}
时间复杂度是摊销的。
编辑:这是如何检查完全 x调用。即使您只是将其更改为至少x次调用(通过将==x
更改为>=x
),但Ross Smith的答案更好,因为内存使用量有一个恒定的上限。