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#
全部评论
hi~同学,秋招遇“寒气”,牛客送温暖啦!23届秋招笔面经有奖征集中,参与就得牛客会员7天免费体验,最高赢300元京东卡!戳我去看>>>https://www.nowcoder.com/link/zhengjipinglun
点赞 回复 分享
发布于 2022-09-05 14:33 北京

相关推荐

预计下个星期就能开奖吧,哪位老哥来给个准信
华孝子爱信等:对接人上周说的是这周
点赞 评论 收藏
分享
过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
昨天 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务