[solution]腾讯TEG_计算广告组_算法题

  度娘笔试归来,题目实打实的,感觉真心不易,上百号人就抢那么几个坑......只恨自己平时积累太少啊~

  故曝一道鹅厂面试用的算法题(当时我就死在了这题上),来为度娘家攒一下RP~



  题目:

     对于长度为N的一个无序的数组a[1..N],请将a进行排序,要求所有正数都排在0之前,所有负数都排在0之后(如果没有0,则所有正数排在负数前)

     要求时间复杂度O(N),空间复杂度O(1) 

  



  题目不难,但给思考的时间很短,大约不到5分钟吧。当时脑子比较短路,于是只给出了O(n) O(n)复杂度的算法,然后就被面试官挂掉了.....

  更杯具的是,走出门就恍然大悟了~



  solution:

     这是一道类排序题,它并不要求严格的一一排序,难点在于如何将排序要求的降低转化为时间与空间的节省。

     首先,起点是快排,O(N*logN)的时间复杂度,我们的算法需要比快排更快。O(N),即遍历一遍数组即完成排序。

       很容易想到的是,题目只分正数/0/负数,如果在遍历数组的时候,将遇到的正数都塞到数组的头部,负数都塞道数组的尾部,即能在遍历一遍的情况完成。

     问题是,在数组结构中,将某个数塞至头部/尾部,需要一位一位的移位,这意味着每次移位都要O(N)/2的时间复杂度,这是不能忍的!

     那么如何做,才能保证O(1)的时间复杂度内完成移位呢?

     当时,我想到的是新建一个空数组b[1..N],

          定义两根指针i,j,i<-1,j<-N。

          然后遍历数组A,

            如果A[k]>0,则b[i]=A[k],i++;

                反之,则b[j]=A[k],j--。

     这样的做法达到了O(N)的时间复杂度要求,但新建的数组b则超过O(1)的空间复杂度。事实上,面试官一开始并没有要求空间复杂度。   

     这样的话,只能在原数组进行操作了,移位又太慢,就只能交换了。交换的话,问题在于和哪一位上的元素进行交换?

     我们不妨用数学归纳法来表征这个问题:

       假设在遍历到第m位的时候,a[1..m]能满足“正数<<0<<负数”,如何操作a[m+1],使得a[m+1]也满足上述条件呢?

          如果a[m+1]=负数,那么我们就不用动它;

          如果a[m+1]=0,我们就将它与排在最前面的负数交换;

          如果a[m+1]=正数,会比较麻烦,我们要将它与最在最前的0交换,然后就将问题转化成了a[m+1]=0的情况。

       综上,我们也需要两根指针i,j。i<-连续的正数序列中最后的那位,j<-连续的0序列中最后的那位。并在m++后,更新i,j即可。

             

伪代码如下:

     int a[N];
       a=random(N);
    int m=0;
       while(a[m]<=0) m++;
       swap(a[0],a[m]);
       int i=0,j=0;
    for(int m=1;m<N;m++)
      if(a[m]==0){
          swap(a[m],a[j+1]);
               j++;      
      }else if(a[m]>0) {
               swap(a[m],a[i+1]);
               i++;
               swap(a[m],a[j+1]);
               j++;
          }        

        

      

时间: 2024-11-03 20:52:48

[solution]腾讯TEG_计算广告组_算法题的相关文章

ML学习分享系列(1)_计算广告小窥[上]

原作:面包包包包包包 改动:寒小阳 && 龙心尘 时间:2016年1月 出处:http://blog.csdn.net/breada/article/details/50572914 http://blog.csdn.net/han_xiaoyang/article/details/50580423 声明:版权全部.转载请联系作者并注明出处 1. 引言 提笔写这篇博客.我的内心是惶恐的.原因非常简单.作为一个资历尚浅的研究生,是没有资格对计算广告这样一个伟大的行业.领域和学科来评头论足的.

ML学习分享系列(2)_计算广告小窥[中]

原作:面包包包包包包 修改:寒小阳 && 龙心尘 时间:2016年2月 出处:http://blog.csdn.net/Breada/article/details/50697030 http://blog.csdn.net/han_xiaoyang/article/details/50697074 声明:版权所有,转载请联系作者并注明出处 1. 引言 提笔写这篇博客,我的内心是惶恐的.原因很简单,作为一个资历尚浅的研究生,是没有资格对计算广告这样一个伟大的行业.领域和学科来评头论足的.之

计算广告小窥[下]要啥自行车!

计算广告小窥[下]要啥自行车! 原作:面包包包包包包 修改:寒小阳 && 龙心尘 鸣谢:百度德川.阿里怀人.阿里口肃.腾讯Fandy王.优酷吕红亮 时间:2016年8月 出处:http://blog.csdn.net/breada/article/details/52275063 声明:版权所有,转载请联系作者并注明出处 1. 引言 提笔写这篇博客,我的内心是惶恐的.原因很简单,作为一个资历尚浅的研究生,是没有资格对计算广告这样一个伟大的行业.领域和学科来评头论足的.之所以这么做,一是总结

[Computing Advertising] 计算广告学笔记之基础概念

因为工作需要,最近一直在关注计算广告学的内容.作为一个新手,学习计算广告学还是建议先看一下刘鹏老师在师徒网的教程<计算广告学>. 有关刘鹏老师的个人介绍:刘鹏现任360商业产品首席架构师,负责 360 商业化变现的产品和技术.曾任微软亚洲研究院研究员.雅虎北京研究院高级科学家 ( 负责全球搜索广告.受众定向广告.个性化内容等项目 ) . MediaV 首席科学家 ( 负责算法和数据平台 ) .以及搜狐集团研究院负责人,WOT 技术峰会特约讲师. 广告其实是大数据的产物,是大数据最实际的应用.我

常见计算广告点击率预估算法总结

欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:段石石 导语: 本文讨论了CTR预估模型,包括工业界使用比较广的比较经典模型和学术界最新的结合DeepLearning的一些工作. 前言 谈到CTR,都多多少少有些了解,尤其在互联网广告这块,简而言之,就是给某个网络服务使用者推送一个广告,该广告被点击的概率,这个问题难度简单到街边算命随口告诉你今天适不适合娶亲.适不适合搬迁一样,也可以复杂到拿到各种诸如龟壳.铜钱等等家伙事,在沐浴更衣.净手煴香后,最后一通预测,发现完全扯淡,被

计算广告学笔记之基础概念

阅读目录 1. 广告的价值 2. 传统广告和互联网广告的区别 3. 推荐系统和互联网广告的区别 4. 互联网广告系统研究核心 5. 广告的售卖模式 6. 计算广告中基本概念 7. 参考资料 因为工作需要,最近一直在关注计算广告学的内容.作为一个新手,学习计算广告学还是建议先看一下刘鹏老师在师徒网的教程<计算广告学>. 有关刘鹏老师的个人介绍:刘鹏现任360商业产品首席架构师,负责 360 商业化变现的产品和技术.曾任微软亚洲研究院研究员.雅虎北京研究院高级科学家 ( 负责全球搜索广告.受众定向

计算广告丨学习资源整理

to be continued Coursera 计算广告学 计算广告2.0 MS&E 239 Computational Advertising 百度计算广告学-2014 秒针系统 – Computational Advertising Infrastructure UCS -计算广告学入门 国内培训机构 后厂理工学院 计算广告方向 七月在线 计算广告 Book <互联网广告算法和系统实践> <计算广告 第2版> Paper Paper Collection of Rea

计算广告学(2)--广告有效性模型

1.广告的接受流程 针对以上的阶段,在计算广告对系统的优化有不同的影响. 广告的天然属性有很大的影响因素(被人看到的次数,越高越好),那么曝光的频率就是影响很大,一个不好的广告位,即使系统优化再好其点击率也不会很高.对应在广告系统中就是讲广告放置的位置的不同带给该广告不同的点击率. 曝光完成后就是关注阶段.在关注阶段的主要原则:1.不要打断用户的任务也就是在用户进行一项任务时,进行推送广告不会带来很好的点击率:2.明确表示为什么要推荐这个广告,通过结合用户使用场景进行推送3.符合用户兴趣或者需求

互联网广告与计算广告学入门

转载于:http://www.myttnn.com/ad/internet-advertisement/ 互联网广告与计算广告学是新媒体时代.互联网时代的到来,应运而生的领域.拥有更详尽的数据.更丰富的展现.跨越时间与空间的交互,让更多具有价值的产品与服务更准确的抵达受众眼球.收集了一些互联网上广告与计算广告学相关的课程与资料,以供朋友共同学习. Stanford – Introduction to Computational Advertising 斯坦福的计算广告学入门,课程主要围绕搜索广告