今日头条编程题一点思路

我被分到了牛客网平台考试,考试比较顺利,都过了,下面是思路
(1)第一题:给一个二维平面,而且横纵坐标都不会重复(简化了排序),要求“不存在左上方还有点”的点集。因为数据量最大是50W,所以基本上用是O(nlogn)的方法解决。
首先按x坐标排个序(因为y不重复所以不用管),然后从后往前(此时保证当前点的x是比后面的x要小的),记录一个当前最大的Y,如果当前这个位置的y比Y还要大,那么明显这个位置的“左上方”不可能有点了。问题解决。

(2)第二题:一段长度是50W的数列,找一段区间,使得:这段区间里的最小值*这段区间值的总和 最大。换句话说就是:min*total是全部区间里最大的。
其实这样的题方法肯定有很多,但是突破口是一定的:从这个最小值入手。枚举这个最小值,然后问题就变成“怎么找这个数前面(和后面)第一个比它小的数的位置”,这个线段树可以解决。好像倍增也可以。当然还有别的方法只要是O(nlogn)肯定都是可以的。


(3)第三题:其实就是一个模拟不过是带优先队列的模拟,因为C++、Java都是自带优先队列的,所以问题不大。将程序员(因为哪个程序员做其实不重要)按目前手头上的idea实现结束时间加入一个优先队列(按结束时间来排序的),然后枚举当前的时间(从0到10000吧,假设),如果到了idea的“提出时间”,将它加入这个hr单独的优先队列里(idea要按照题目要求先排序),每个时间点都查询有没有空的程序员?有没有idea需要执行?按照这种思路大概就可以了。<!--说起来容易做起来难-->
#字节跳动#
全部评论
第二题可以使用分治的算法,计算当前数组所有值的结果,然后找到最小数,分别计算最小数左边数组的结果和右边数组的结果,这样递归下去就找到答案了
点赞 回复 分享
发布于 2017-08-22 21:34
分到牛客网是贼好的,赛码卡死了
点赞 回复 分享
发布于 2017-08-22 21:26
第一道题我的做法跟楼主的一样,但就是只通过了70%,真是奇怪。第二道题也是一样,但是只通过了80%。
点赞 回复 分享
发布于 2017-08-22 21:38
第二题题目中规定了所有数字都在[0,100]之间,不是应该用桶排序吗?然而检测没通过。。 还是膜拜大佬。。
点赞 回复 分享
发布于 2017-08-22 21:20
第二题,有O(n)的,看一下最长回文字串的mancher算法,借用那个算法思想,枚举xi的下限时,如果xj比xi大,就把xj的左区间加进来,然后判L(xj)是不是大于xi,是的话继续,右区间同理。
点赞 回复 分享
发布于 2017-08-31 21:10
大神,可否粘出来你的代码???跪求
点赞 回复 分享
发布于 2017-08-23 11:29
第二题我是100*n的复杂度
点赞 回复 分享
发布于 2017-08-23 09:38
大神,有没有代码完整版可以参考;我的通过率太低orz
点赞 回复 分享
发布于 2017-08-23 09:14
哈哈哈,人脸自有大佬在🌝
点赞 回复 分享
发布于 2017-08-23 01:55
前排仰慕大佬…顺便求大佬贴代码………
点赞 回复 分享
发布于 2017-08-23 00:06
第一题一样的思路,本题通过,跑起来是0,用的python不知道是不是输入输出的毛病
点赞 回复 分享
发布于 2017-08-22 22:28
第一题这么做,50%。哪里错了吗 bool compare(pair<int, int> a, pair<int, int> b) { if (a.first < b.first) return true; else if (a.first == b.first) return a.second <= b.second; else return false; } void test() { int n; cin >> n; vector<pair<int, int> >arr; for (int i = 0; i < n; i++) { pair<int, int> tmp; cin >> tmp.first >> tmp.second; arr.push_back(tmp); } sort(arr.begin(), arr.end(), compare); vector<pair<int, int> > res; res.push_back(arr[n - 1]); int maxy = arr[n - 1].second; for (int i = n-2; i >= 0; i--) { if (arr[i].second > maxy) { res.push_back(arr[i]); maxy = arr[i].second; } } int len = res.size(); for (int i = len - 1; i >= 0; i--) cout << res[i].first << " " << res[i].second << endl; }
点赞 回复 分享
发布于 2017-08-22 21:52
第二题我开始也想莽线段树,一想代码太长,直接枚举最小值,然后统计以l为起点的最大区间,就过了
点赞 回复 分享
发布于 2017-08-22 21:52
第一个方法跟你做的完全一样,但是就是50%
点赞 回复 分享
发布于 2017-08-22 21:47
第一题思路一样,排序用的python的sort方法,只过了50%,剩下就超时了。
点赞 回复 分享
发布于 2017-08-22 21:46
第一题我跟你一样一样的为啥只过百分之七十
点赞 回复 分享
发布于 2017-08-22 21:37
同学你好!首先感谢你参加今日头条笔试,如果在笔试过程中遇到任何问题,可以通过申诉通道与我们联系。情况核对属实后,可以有二次笔试的机会,成绩以最后一次考试为准。【申诉通道】campushr@bytedance.com,请在正文简要说明笔试遇到的问题,邮件标题为: 笔试申诉+岗位+姓名+***话,我们会尽快回复~
点赞 回复 分享
发布于 2017-08-22 21:33
第二题线段树是认真的吗?500000 * 4 * 2的数组大小,想了想就排除了
点赞 回复 分享
发布于 2017-08-22 21:32
给大佬递茶
点赞 回复 分享
发布于 2017-08-22 21:30
求大佬第三题代码。通过30%真是痛苦了...
点赞 回复 分享
发布于 2017-08-22 21:26

相关推荐

04-11 21:31
四川大学 Java
野猪不是猪🐗:(ja)va学弟这招太狠了
点赞 评论 收藏
分享
评论
19
45
分享

创作者周榜

更多
牛客网
牛客企业服务