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#