面试算法查询

时间:2012-11-25 22:28:53

标签: c++ algorithm pseudocode

  

给定常数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;
}

有人可以提出替代方案吗?

2 个答案:

答案 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的答案更好,因为内存使用量有一个恒定的上限。