[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=;
while(a[m]<=) m++;
swap(a[],a[m]);
int i=,j=;
for(int m=;m<N;m++)
if(a[m]==){
swap(a[m],a[j+]);
j++;
}else if(a[m]>0) {
swap(a[m],a[i+]);
i++;
swap(a[m],a[j+]);
j++;
}
[solution]腾讯TEG_计算广告组_算法题的更多相关文章
- ML学习分享系列(2)_计算广告小窥[中]
原作:面包包包包包包 改动:寒小阳 && 龙心尘 时间:2016年2月 出处:http://blog.csdn.net/Breada/article/details/50697030 ...
- ML学习分享系列(1)_计算广告小窥[上]
原作:面包包包包包包 修改:寒小阳 && 龙心尘 时间:2016年1月 出处: http://blog.csdn.net/breada/article/details/50572914 ...
- [Computational Advertising] 计算广告学笔记之基础概念
因为工作需要,最近一直在关注计算广告学的内容.作为一个新手,学习计算广告学还是建议先看一下刘鹏老师在师徒网的教程<计算广告学>. 有关刘鹏老师的个人介绍:刘鹏现任360商业产品首席架构师, ...
- 海量数据挖掘MMDS week5: 计算广告Computational Advertising
http://blog.csdn.net/pipisorry/article/details/49428053 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- 云之讯融合通讯开放平台_提供融合语音,短信,VoIP,视频和IM等通讯API及SDK。
云之讯融合通讯开放平台_提供融合语音,短信,VoIP,视频和IM等通讯API及SDK. undefined 全明星之极验证 - SendCloud undefined [转载]国内外几个主流的在线开发 ...
- 未来已来,腾讯AI计算网络
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:由鹅厂网事发表在云+社区 "鹅厂网事"由深圳市腾讯计算机系统有限公司技术工程事业群网络平台部运营,我们希望与业界各位志同道合的伙伴交流 ...
- 问题:计算foldRight(1)(_-_) 与foldLeft(1)(_-_)值不一样
List(1,2,3,4)问题:计算foldRight(1)(_-_) 与foldLeft(1)(_-_)值不一样首先看foldRight(1)(_-_)计算过程((( (1-1)-2)-3)-4) ...
- 计算广告学-多点归因模型(Multi-Touch Attribution Model)
计算广告学中的一个重要的问题是, 如果用户产生了一次转化(conversion, 比如购买, 注册等), 且该用户在转化之前看过大量不同频道(比如搜索, 展示, 社交等等)的广告, 那么我们如何确定是 ...
- 实时竞价RTB广告平台_传漾科技_中国领先的智能数字营销引擎
实时竞价RTB广告平台_传漾科技_中国领先的智能数字营销引擎 Programmatic Framework™ 传漾程序化购买框架
随机推荐
- MySQL存储过程多条修改语句
DROP procedure Sel_Function_ActivityPastDueDELIMITER $$DROP procedure IF EXISTS`shouyi`.`Sel_Functio ...
- mysql(数据库,sql语句,普通查询)
第1章 数据库 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. l 什 ...
- java的三大特性之一继承概述
0.继承-----注意事项 00.子类最多只能继承一个父类(指直接继承) 01.java所有的类都是Object的子类 02.JPK6.0中有202个包3777个类,接口,异常,枚举,注释和错误 03 ...
- 1169 传纸条 2008年NOIP全国联赛提高组 个人博客:attack.cf
1169 传纸条 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小渊和小轩 ...
- MUI获取文本框的值
MUI事件绑定注意父节点.子节点(也可以是标签选择器) js部分 html部分
- 单列表变量与字符串拆分的对照(SqlServer)
最近遇到一个问题,在SQLServer中,需要根据用户传入的一系列ID值更新对应的记录.有两种方法,一种是将这些ID值使用逗号分隔,拼接成字符串传入,一种是以表变量的方式传入.最开始,我想当然的认为传 ...
- UWP开发:存储容器设置&复合设置数据
有时候为了将应用设置进行分类,需要创建新的容器进行存储应用设置的信息. 1,容器的创建:在一个根容器里嵌套一个新容器 1)首先获取根容器. 2)调用ApplicationDataContainer.C ...
- jQuery UI -- Repeater & 手风琴(Accordion)效果
jQuery UI -- Repeater & 手风琴(Accordion)效果 很简单的范例,完全不用写程序 直接套用就能做! 但是,基础不稳的人,连「复制贴上」直接套用, 对您而言,都困难 ...
- OpenLayers 3 的 图层控制控件
openlayers3的control中没有提供默认的图层控制控件. 但是git上已经有造好的轮子,直接拿来用就可以了.地址 https://github.com/walkermatt/ol3-lay ...
- Nuget~管理自己的包包
很久很久以前,自己就想有个包包,最近又从网上淘了一个,价格不便宜呢,99块,还是个小腰包,不过作工还算精良,我喜欢的类型,帆布休闲包,可以将我的手机,耳机,水,小烟,小酒,小伞都放里,方便至极,哈哈!