2024.07.30谷歌实习

1. 更衣室

一个自动化的储物柜系统被引入更衣室,当客户访问时,系统的工作方式如下:
如果客户没有被分配储物柜,系统分配给他们一个具有最小可用编号的储物柜。如果客户已经有分配的储物柜,系统打开并释放储物柜。
之后,该储物柜可以重新分配给其他客户。锁柜从1开始编号。一天开始时,所有锁柜都是空的。
系统被访问了N次。问最后一次被分配给某个客户的是哪个储物柜?

小根堆维护可用的递增序号即可

int solution(vector<string>&clients){
    int n = clients.size();
    priority_queue<int,vector<int>,greater<int>> min_heap;
    for(int i=0;i<n;i++)
        min_heap.push(i+1);//可用的编号
    unordered_map<string,int> m;//用户编号映射
    int res = 0;
    for(auto client:clients){
        if(m.count(client)){//释放
            min_heap.push(m[client]);
            m.erase(client);
        }
        else{//分配
            m[client] = min_heap.top();
            min_heap.pop();
            res = m[client];
        }
    }
    return res;
}

2. 心率最大差异

有 N 次连续的测量(编号从 0 到 N-1),在第 K 次测量中,设备记录了心率 () 和活动水平 ()
(可能的活动水平是 "Low"、"Normal" 或 "High")。求在连续的同一活动水平期间,心率最高值和最低值之间的最大差异是多少?

int solution(vector<int> &heartRate,vector<string> &activityLeve){
    string curlevel = "None";
    int mn = INT_MAX;
    int mx = INT_MIN;
    int res = 0;
    int n = heartRate.size();
    for(int i=0;i<n;i++){
        if(curlevel!=activityLeve[i]){//不连续
            mn = heartRate[i];
            mx = heartRate[i];
            curlevel = activityLeve[i];
        }
        else{
            mn = min(mn,heartRate[i]);
            mx = max(mx,heartRate[i]);
            res = mx-mn;
        }
    }
    return res;
}

posted @ 2024-09-04 18:46  失控D大白兔  阅读(8)  评论(0编辑  收藏  举报