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;
}