阿里2015实习生招聘在线测试----编程题,设计有限任务响应队列

讨论帖子:

http://bbs.csdn.net/topics/391009829

解决方案:

#include <algorithm>
#include <forward_list>
#include <functional>
#include <iostream>
#include <iterator>
#include <memory>
#include <queue>
#include <random>
#include <string>
#include <unordered_map>
#include <utility>

using namespace std;

template < typename TTask >
class ManagedQueue
{
//typedefs
public:
    typedef typename queue< TTask > TaskQueue;
    typedef unordered_map< int, int > UserMap;
    typedef forward_list< int > TaskSelections;
    typedef unordered_map< int, TaskQueue > TaskQueues;
//Fields
public:
    UserMap Users;
private:
    TaskQueues tasks;   //每个用户拥有一个TaskQueue
    TaskSelections task_queues; //内含大量UID,其数量和用户配额相同
    mt19937 rng;    //随机数发生器
//Methods
private:
    //向备选队列集合中随机插入用户ID,以便Dequeue时能按配额均匀取出任务
    void RandomInsert(int user_id, int count)
    {
        uniform_int_distribution<int> dist(0, 2);
        if (task_queues.empty())
        {
            for (int i = 0; i < count; i++)
            {
                task_queues.push_front(user_id);
            }
        }
        else
        {
            while (count > 0)
            {
                for (auto i = task_queues.begin(); i != task_queues.end(); i++)
                {
                    if (dist(rng) == 1)
                    {
                        task_queues.insert_after(i, user_id);
                        count--;
                    }
                }
            }
        }
    }
public:
    //UserMap: UID -> 配额
    ManagedQueue(const UserMap& user_table)
        : Users(user_table), rng(random_device()())
    {
        //为每一个用户分配一个任务队列
        for (auto& p : user_table)
        {
            tasks.emplace(p.first, queue< TTask >());
        }
    }
    //如果添加任务前用户任务队列为空,就向备选队列集合中添加与配额相当数量的UID
    void Enqueue(int user_id, const TTask& task)
    {
        auto& q = tasks[user_id];
        bool insert_new = q.empty();
        q.push(task);
        if (insert_new)
        {
            RandomInsert(user_id, Users[user_id]);
        }
    }
    //在备选队列中随机抽一个UID,并根据UID找到对应的任务队列,从任务队列中取出任务
    //如果任务队列中没有任务,那么从备选队列集合中删除对应的UID
    TTask Dequeue()
    {
        uniform_int_distribution<int> dist(0, distance(task_queues.begin(), task_queues.end()) - 1);
        auto it = task_queues.begin();
        advance(it, dist(rng));
        auto& q = tasks[*it];
        auto ret = q.front();
        q.pop();
        if (q.empty())
        {
            task_queues.remove_if([&](int user_id) { return tasks[user_id].empty(); });
        }
        return ret;
    }
};

int main()
{
    unordered_map<int, int> user = { {1001, 10}, {1002, 20}, {1003, 40}, {1004, 30} };
    ManagedQueue<string> q(user);
    for (int i = 0; i < 1000; i++)
    {
        q.Enqueue(1001 + i % 4, string("Task ") + to_string(i % 4 + 1));
    }

    for (int i = 0; i < 400; i++)
    {
        cout << q.Dequeue() << "\t";
    }
    return 0;
}
时间: 2024-09-08 22:12:22

阿里2015实习生招聘在线测试----编程题,设计有限任务响应队列的相关文章

鼠标点击坐标-一道C++编程题 绘制三角形 鼠标响应 填充

问题描述 一道C++编程题 绘制三角形 鼠标响应 填充 求大神帮忙!!拜托!写一部分也行 解决方案 除了中国移动4G,我不知道你图上说的是什么 解决方案二: 你自己提问都不愿意把问题说清楚,就这个马虎的态度,还指望有人愿意帮你? 解决方案三: 不是的,是我手机的问题 解决方案四: 这个网站好像放不出来

阿里2017实习生招聘-官方备战指导书籍

阿里2017年春季实习生招聘正在火热进行中, 同时一大波互联网公司的招聘也在进行中! 那么,为即将到来的[笔试]和[面试],你准备好了吗? 如何在剩下的时间里,高效提升个人能力.大大提高求职通过率? 阿里集团校园招聘团队官方出版: 为求职大型互联网企业的学生量身打造的官方指导书籍--<技术之瞳:阿里巴巴技术笔试心得> 众多大咖联袂推荐:道哥.阮一峰.winter.毕玄.玉伯.朴灵.汪方进-- 36位阿里资深专家(校招笔试官)合著,亲自剖析招聘时的考察要点和解答思路 内含阿里历年校招精华笔试真题

java编程题桌面设计。。。。。

问题描述 java编程题桌面设计..... 实现文件的加密与解密,关键就在加.解密的算法.程序的设计思想就是通过流从文件中读取数据进行处理,然后写入到新文件中,当解密时通过对应的方式对加密的文件进行处理恢复原文件. (1)文件加密处理算法 for (int i = 0; i < buffer.length; i++) { //循环遍历从流中读取的数组 int ibt = buffer[i]; ibt += 100; //将数组中数据做相加运算 ibt %= 256; buffer[i] = (b

c语言-【编程题】替换空格,在线测试系统显示程序异常退出

问题描述 [编程题]替换空格,在线测试系统显示程序异常退出 题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 我的编程思想是先统计空格个数blankCount,由此算出替换后的字符串长度tLength,后来通过下标从后面往前面替换,这样遇到空格插入%20,否则将字符后移. 我的程序: class Solution { public: void replaceSpace(c

如何拿到阿里技术offer:从《2.5年, 从0 -&gt;阿里》体味阿里内推招聘

前面的一段时间时间和大家分享了许多文章,一部分文章是关于校招,另外一部分是关于社招的面试经验,社招往往比校招的要求更加严格,相比之下也更难.其实在阿里,除了校招和社招这两种招聘方式之外还有第三种,就是内推.所谓内推,就是在公司或者企业里,有了解或者熟悉你的人,并且认为你有担任某些技术人员的能力,直接跨过招聘网站将你的简历交给面试官的一种工作的推荐方式(大概就是这样吧). BAT都是存在内推的,在知乎上有篇文章<阿里内推面试,应该注意什么?>(链接)有不少可以参考的意见,其中几点我觉得能让我们更

一道关于二叉树的编程题

问题描述 一道关于二叉树的编程题 给出一组整数对 { (a[0], b[0]), (a[1], b[1]) ... (a[n-1], b[n-1]) },所有 a 值 和 b 值分别不重复(任意 i != j 满足 a[i] != a[j] 且 b[i] != b[j]).构造一棵 n 结点的二叉树,将这 n 个整数对分配到各个结点上.根和所有子树满足以下条件: 1) 所有结点的 a 值满足二叉查找树的顺序,即 left->a < root->a && root->

招聘提问通用题库

http://www.cnitblog.com/zouzheng/articles/21852.html     招聘提问通用题库   类型 序号 问题 测试要点 基本情况 1 请用最简洁的语言描述您从前的工作经历和工作成果. 测试应聘者是否能够用几句话概要地介绍其主要的工作信息和重点业绩,而不是以流水帐的形式重复履历表有已经注明的内容.在介绍工作成果时,注意应聘者能否正确表述其在原单位所发挥的作用.尽管有关基本能力的提问大多可以通过简历或应聘表格反映出来,但通过回答可以考察应聘者的语言表达能力

欢聚时代笔试题,滴滴出行编程题

感谢赛码网,奇怪的A题设计,bat一轮大企业过去,没A上去几道. intel 笔试: 1.单链表逆置,双向链表删除 2.层次遍历二叉树 3.rand4()生成rand9() 4.非常多的各种指针操作. 面试:完全的问项目 1.stl boost c++中的智能指针,以及其实现原理? 2.b 树的插入 3.代码实现stack 的排序,只能用stack 的基本操作 乐港面试: 服务器实时排名?(和完美世界一个样子) 为啥下午5点review code 的问题. // testofrecursive.

linux编程-关于Linux的三个编程题,想了半天毫无头绪,感觉Linux编程好复杂。求大家帮助帮助我,谢谢。

问题描述 关于Linux的三个编程题,想了半天毫无头绪,感觉Linux编程好复杂.求大家帮助帮助我,谢谢. 1:子进程每隔一秒向文件写入信息,父进程每隔三秒读出子进程所写的信息并输出到屏幕. 2:模拟shell,设计一个交互式命令处理程序,注意对命令参数和环境参数的处理. 3:编写一个守护进程,实现功能为:每隔一秒,向当前目录下的hello文件里写入一行helloworld. 解决方案 Linux设备驱动编程之复杂设备驱动25岁了,是学linux运维还是编程好呢?求指点下 .. 解决方案二: 楼