📣 VIP通行证夏日特惠 限时立减$68
123
返回列表 发新帖
楼主: 月亮有心
跳转到指定楼层
上一主题 下一主题
收起左侧

Facebook电面

🔗
mingzhou1987 2016-10-21 13:16:12 | 只看该作者
全局:
谢谢楼主面经,写了一下第一题,祝楼主onsite一切顺利
string scheduleTaskWithCooldown(string s, int k)
{
        map<char, int> m;
        map<char, int> lastIdx;
        string res;
        for (int i = 0; i < s.size(); i++)
        {
                if (lastIdx.find(s[i]) == lastIdx.end())
                {
                        res.push_back(s[i]);
                        lastIdx[s[i]] = res.size() - 1;
                }
                else
                {
                        while (lastIdx[s[i]] + k > res.size() - 1)
                        {
                                res += " ";
                        }
                        res.push_back(s[i]);
                        lastIdx[s[i]] = res.size() - 1;
                }
        }
        return res;
}
回复

使用道具 举报

🔗
 楼主| 月亮有心 2016-10-21 16:11:51 | 只看该作者
全局:
zhangyanuuuuu 发表于 2016-10-21 12:19
但是感觉单纯用heap还是不行,毕竟比如12233这种cooldown是3的话,选完23之后要选1,需要保证在相同frequen ...

我是这么实现的,先建了个类,存着task number和freq,然后heap的排序是先freq降序,如果freq一样,那就按task数字大小升序排。如果heap.size大于等于cool down,是不需要考虑你说的情况的。为了最后heap.size小于cool down的情况,用hashtable来存储最近一轮输出的结果和位置,然后最后一轮才需要填充cool down。
给楼主的代码一个小建议,lastpos初始化值可以说-cooldown-1,这样后面可以少一个if的情况
回复

使用道具 举报

🔗
 楼主| 月亮有心 2016-10-21 16:12:47 | 只看该作者
全局:
mingzhou1987 发表于 2016-10-21 13:16
谢谢楼主面经,写了一下第一题,祝楼主onsite一切顺利
string scheduleTaskWithCooldown(string s, int k) ...

不需要最终的输出序列的,只要总时间就可以了
回复

使用道具 举报

🔗
zhangyanuuuuu 2016-10-22 00:35:45 | 只看该作者
全局:
月亮有心 发表于 2016-10-21 16:11
我是这么实现的,先建了个类,存着task number和freq,然后heap的排序是先freq降序,如果freq一样,那就 ...

哦哦,初始化确实,我也觉得写的有点ugly,多谢!
不过对于你说的最后一轮才需要填充cooldown不是很理解,这个没法保证吧,比如1112223333这种cooldown是10的话,怎么样每轮都得cooldown,heap的size一上来就可以小于cooldown不是么
回复

使用道具 举报

🔗
 楼主| 月亮有心 2016-10-22 03:21:08 | 只看该作者
全局:
对啊,所以这样子就要动用hashtable了啊
回复

使用道具 举报

🔗
 楼主| 月亮有心 2016-10-22 03:22:29 | 只看该作者
全局:
zhangyanuuuuu 发表于 2016-10-22 00:35
哦哦,初始化确实,我也觉得写的有点ugly,多谢!
不过对于你说的最后一轮才需要填充cooldown不是很理解 ...

对啊,所以这样子要用hashtable了,其实和你思路差不多,总之是要记录位置的
回复

使用道具 举报

🔗
zhangyanuuuuu 2016-10-22 05:46:53 | 只看该作者
全局:
月亮有心 发表于 2016-10-22 03:22
对啊,所以这样子要用hashtable了,其实和你思路差不多,总之是要记录位置的

懂你的意思了,基本上还是跟lc那个题的解法比较像,就是多加了一个记录上次位置,写了一下
int rearrangeTask(vector<int>& tasks, int cooldown) {
        unordered_map<int, int> fre;
        for (auto task : tasks) {
                fre[task]++;
        }
        priority_queue<pair<int, int>> queue;
        for (auto ele : fre) {
                queue.emplace(ele.second, ele.first);
        }
        unordered_map<int, int> lastPos;
        for (auto ele : fre) {
                lastPos[ele.first] = -1 - cooldown;
        }
        int curr = 0;
        while (!queue.empty()) {
                int len = queue.size();
                auto ele = queue.top();
                if (curr - lastPos[ele.second] - 1 < cooldown) {
                        curr += cooldown - (curr - lastPos[ele.second] - 1);
                }
                vector<pair<int, int>> cache;
                for (int i = 0; i < min(len, cooldown); i++) {
                        auto ele = queue.top();
                        queue.pop();
                        lastPos[ele.second] = curr++;
                        if (--ele.first > 0) {
                                cache.push_back(ele);
                        }
                }
                for (auto ele : cache) {
                        queue.push(ele);
                }
        }
        return curr;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表