2018头条笔试编程题 思路分享

第一题( 最优复杂度O(n) )
题干:在第一象限内,有一些(n个)离散的点(x,y均为自然数,且某一行、列都只有一个点)
代码需要输出一些“最大点”(设待考察点为x0,y0,如果存在x,y,满足x>x0且y>y0,则x0,y0不是最大点),输出顺序为x值递增顺序。

思路:
有点类似于凸包问题,但实际可以这么做->
(1)对于所有输入的点,按照x值递增排序。——因为x值没有重复,且已知x的范围,所以使用位图法排序,复杂度O(n)。直接sort就当做是nlog(n)咯!
(2)从最右侧的点(xn,yn)开始研究,他的右边没有点了,题干的条件被破坏,那么(xn,yn)是最大点;同时用max来表示当前研究点右侧(包含当前)点的最大y值。
(3)研究(x n-1,y n-1),因为x n-1的右侧已经有点x n,那么(x n-1,y n-1)是不是最大点的关键就在于,y n-1<max?如果小于,那x n-1不是最大点,否则他是最大点。更新max值
(4)循环第三步,直到待考察的点为空。——复杂度O(n)

感觉自我陶醉在O(n)的代码里~~~~~

第二题(O(n2))
题干:给定一个序列,如【6,2,1】,要求输出:在某一个区间上的最小值min 与这个区间上所有值的和sum的乘积,最终只输出最大的乘积值。
思路;肯定是用两个index来模拟区间范围,然后在区间里寻找min和sum了。
那么可以这么做:
int max=-1;
for(int i=0;i<n;i++){
    int sum = 0;
    int min = array[i];
    for(int j=i;j<n;++){
        if(array[j]<min)min=array[j];//更新min
        sum+=array[j];//更新sum
        if(min*sum>max)max=min*sum;
    }
}
复杂度应该是O(n2)

代码就不上了,因为鄙人第一题10%,第二题30%,上一次网易编程题也很惨。为什么本地调的好好的代码,交上去就不行呢?

#字节跳动#
全部评论
跟你一样思路,通过率70%,没注意到计数排序,直接Arrays.sort
点赞 回复
分享
发布于 2017-08-23 11:37
牛客网可以提供测试用例吗,不然永远不知道卡在哪里永远没法提高啊
点赞 回复
分享
发布于 2017-08-24 13:13
滴滴
校招火热招聘中
官网直投
求大神指正思路是否有问题,我想去申请重考~
点赞 回复
分享
发布于 2017-08-22 22:26
同学你好!首先感谢你参加今日头条笔试,如果在笔试过程中遇到任何问题,可以通过申诉通道与我们联系。情况核对属实后,可以有二次笔试的机会,成绩以最后一次考试为准。【申诉通道】campushr@bytedance.com,请在正文简要说明笔试遇到的问题,邮件标题为: 笔试申诉+岗位+姓名+***话,我们会尽快回复~
点赞 回复
分享
发布于 2017-08-22 22:27
其实最想知道的是测试用例是什么?为什么过不了
点赞 回复
分享
发布于 2017-08-22 22:43
我也是10 30
点赞 回复
分享
发布于 2017-08-22 22:46
第二题好像要用单调栈做 复杂度只有O(n)
点赞 回复
分享
发布于 2017-08-22 22:46
第二题数据量是10的5次方,平方能过也是见鬼了
点赞 回复
分享
发布于 2017-08-22 23:58
用位图来做不是O(N)吧 不是要遍历bitset么   时间复杂度和X的范围有关系吧  应该是O(max(x))吧  x最大可取1e9  n最大100000
点赞 回复
分享
发布于 2017-08-24 14:51

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务