20220902 oppo机试 休眠时间 100%
static bool cmp1(vector<int>a, vector<int>b)
{
return a[0] < b[0];
}
vector<int> getWakeLockContrib(vector<vector<int> >& wakeLock) {
// write code here
unordered_map<int, int>map1;
for (int i = 0; i < wakeLock.size(); i++)
{
for (int j = 0; j < wakeLock[i].size(); j++)
{
map1[wakeLock[i][j]] = 0;
}
}//首先记录出现的端点
//map1中类似:1234 1240 1236 1238 1245 1250
// 0 0 0 0 0 0
vector<vector<int>>vec;//将一个数组中长度大于2的,切分成大小为2的,例如将[1236,1238,1245,1250]切分为[1236,1238],[1245,1250]
for (int i = 0; i < wakeLock.size(); i++)
{
if (wakeLock[i].size() == 2)
{
vec.push_back(wakeLock[i]);
continue;
}
else
{
for (int j = 0; j < wakeLock[i].size(); j = j + 2)
{
vector<int>temp = { wakeLock[i][j],wakeLock[i][j + 1] };
vec.push_back(temp);
}
}
}
vector<vector<int>>vec2;//用端点来判断休眠锁被共用的应用数
for (auto it : map1)
{
for (int i = 0; i < vec.size(); i++)
{
if (it.first >= vec[i][0] && it.first <= vec[i][1])
{
it.second++;
}
}
vector<int>temp = { it.first,it.second };
vec2.push_back(temp);
}
//vec2中类似:1234 1240 1236 1238 1245 1250
// 1 1 2 2 1 1
sort(vec2.begin(), vec2.end(), cmp1);
//排序
//vec2中类似:1234 1236 1238 1240 1245 1250
// 1 2 2 1 1 1
vector<int>res;
for (int i = 0; i < wakeLock.size(); i++)
{
int result = 0;//每一个wakeLock.size()数组元素的结果 //以[1234,1240]为例
for (int j = 0; j < wakeLock[i].size(); j = j + 2)//因为有可能分成多段,所以要分段计算
{
int left = wakeLock[i][j];//开始时间 1234
int right = wakeLock[i][j + 1];//结束占用的时间 1240
for (int k = 0; k < vec2.size(); k++)
{
if (vec2[k][0] == left) //找到开始节点,开始计算 k=0
{
while (k + 1 < vec2.size() && vec2[k + 1][0] <= right)//vec2[k + 1][0]=1236 vec2[k+1][0]=1238 vec2[k+1][0]=1240 vec2[k+1][0]=1245(退出循环)
{
if (vec2[k + 1][1] != vec2[k][1])//频率不同
{
result = result + vec2[k + 1][0] - vec2[k][0];//result第一次:1236-1234=2; //result第三次:1240-1238=2,加上前两次的 2+3=5;
k = k + 1;
}
else
{
result = result + (vec2[k + 1][0] - vec2[k][0]) / vec2[k][1];//result第二次:(1238-1236)/2=1,加上第一次=3
k = k + 1;
}
}
break;
}
}
}
res.push_back(result);
}
return res;
}
快结束才写出来。。。许愿一个进面。。。
感觉自己写复杂了,应该是数据量不多才过了。
#OPPO#

查看7道真题和解析