插队的人解题

那些插队的人

http://www.nowcoder.com/questionTerminal/31c1ae9d1c804b66b6ae17181e76f4f0

其中n <= 1e9,创建数组进行模拟插队会超内存,不可行。只能找规律。

  • 我们可以从cutIn中找到编号的最大值,在他之后的队伍没有参与插队,位置不变
  • cutIn中会存在通过插队还在原来位置上的人,将cutIn倒序,且去重,就是最终的前len个人
class Solution {
public:
    /**
     * 计算有多少个人最终不在自己原来的位置上
     * @param n int整型 队伍总长
     * @param cutIn int整型vector 依次会插队到最前方的人的编号
     * @return int整型
     */
    int countDislocation(int n, vector<int>& cutIn) {
        // write code here
        if(n == 1 || cutIn.empty()) return 0;
        int len = cutIn.size();
        //计算插队编号的最大值,该编号之后的队伍位置不变
        int maxV = cutIn[0];
        for(int i = 1; i < len; i++){
            if(cutIn[i] > maxV){
                maxV = cutIn[i];
            }
        }
        int part_1 = n - maxV;
        //计算已经打乱顺序的队伍,有哪些人通过插队还在原来的位置上
        //将cutIn倒序,且去重,就是最终的前len个人
        set<int> set;
        int part_2 = 0;
        int index = 1;
        for(int i = cutIn.size() - 1; i >= 0; i--){
            if(set.find(cutIn[i]) == set.end()){
                set.insert(cutIn[i]);
            }else{
                continue;
            }
            if(cutIn[i] == index){
                part_2++;
            }
            index++;
        }
        return n - (part_1 + part_2);
    }
};
全部评论

相关推荐

04-29 18:07
常州大学 Java
寂静羽翼:兄弟我已经亲身经历了,双非没实习很多大厂还是会给笔试的,可是有的公司笔试做的好也不给面一直卡着,ssob基本看我没实习都拒绝我了,但是每天投满偶尔也能有一两场初创公司的面试,但是薪资基本在五六千
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务