(转)淘宝面试的几个算法题

场景设计面试题 100亿个数据中找出最大的1000个 海量数据处理,思路基本上是:必须分块处理,然后再合并起来。 1.采用小顶堆算法 我们知道完全二叉树有几个非常重要的特性,就是假如该二叉树中总共有N个节点,那么该二叉树的深度就是log2N,对于小顶堆来说移动根元素到 底部或者移动底部元素到根部只需要log2N,相比N来说时间复杂度优化太多了(1亿的logN值是26-27的一个浮点数)。基本的思路就是先从文件中取出1000个元素构建一个小顶堆数组k,然后依次对剩下的100亿-1000个数字进行遍历m,如果m大于小顶堆的根元 阅读详情

一、给你1副扑克牌,你怎么发牌给4个人?

我:首先扑克牌可以排序,其次,可以每次产生1个随机数,然后把该随机数对应的牌发出去,每次发的牌轮流给第1个人、第2个人……奥,不对,这样可能导致已经发出去的牌再次被发出去!(进入沉思~)

他:Smilence...

我:(随即就给出可行的低效解) 可以这样嘛,首先声明,不考虑效率的前提下,可以这样做:把每张牌维护成一个结点,串联成一个链表。每次还是产生随机数,对当前牌的张数取余得到N,从单链表的头结点开始next指针访问N次,最终指向结点p,把p结点从链表中删除,并将对应的牌发给第(i++)%4+1个人;这样循环下去直到链表为空。

他:你这样做的确是可以实现发牌,可是效率低了点,那还有没有更好的方法呢?

1分钟过去了……

他:或许你可以考虑这样的算法,还是每次产生随机数,把对应的牌发出去,然后将此数字标记,以后再随机到这个数字了就不发,继续随机

我:(马上指出)那你发到最后的时候,岂不是一直在那里随机,很少有机会能随机到你想要的剩下的没发出去的那几个数字?

他:那也是的,那你有更好的方法吗?

我:(好好思考一番后) 还可以这样做,把54张扑克牌维护成54个元素的char的数组,然后产生54个随机数,均对4取余,分别存入这个数组的54个单元中,然后遍历这个数组,对应数字为0的牌发给第1个人,对应数字为1的牌发给第2个人……当然了,这样做,可能会有人多拿牌,有人少拿牌,强制从拿牌多的人那里抽取足量的牌。 哎,这样好像不大好办,还要算拿多少牌回来,容我再想想 

他:没啊,我觉得这个算法挺好的啊

我:(想了半天,最终也没想出更好的)

他:你这方法还不错的,算法复杂度O(n)

我:那再最终总结下,

      数组也不用了,维护一个计数值card_count,初试为1,表示第1张牌;

      维护4个计数值count[1]、count[2]、count[3]、count[4],初始均为0,当相应的人被发到牌后就++,用来表示4个人各自当前的牌数;

      然后产生一个随机数r%=4,若r为n,则将第count张牌发给第n+1个人,count [n+1]++;

      检查count[1]、count[2]、count[3]、count[4],哪个数达到了54/4+1就不再对那个人发牌,然后只产生其余3个人对应的随机数;

      继续以上发牌,直到card_count达到54为止;

他:满意地笑了笑

二、对于刚刚发牌的算法中用到的随机算法,你怎么定随机种子?

我:随机种子一般都是采用当前系统时间或者设备编号之类的,采用系统时间是为了种子的随机性,保证伪随机数产生得比较“随机”;用设备号的情况一般是多个设备跑同一个算法,都用到了随机数的时候,比如几台机器组网通信,要做到CSMA,需要随机退避,而因为随机数生成程序的随机是伪随机,如果这几台机器每次都随机到一样的数,那么当发生冲突的时候,他们再随机同样长度的时间来退避,结果还会是冲突,而因为这些机器的编号(比如IP地址)不一样,那么用来作为种子,就会各自采用不同组的伪随机数,就能达到随机退避的效果了!

他:恩,那你说的用系统时间作为种子,是怎么做到的呢?

我:系统调用啊,比如Windows编程,利用提供的

time()之类的API就可以得到当前系统时间了,因为每次运行的时间不同,所以产生的随机数也就比较“随机”了。

他:可以的,不过如果说这个发牌的程序需要运行很多很多次,而因为算法复杂度不高,所以每次都是很快就运行完了,第二次运行的时候,获得的系统时间基本上没变,那是不是每次产生的随机数都比较确定?不够“随机”?该怎么解决?

我:额。。。(好久以后)不清楚啊,既然时间没变的话,那当然没办法了,要不再结合其他可变的参数组合成为种子?

他:(自己都在那里偷笑了)哈哈哈,这还不简单,你每次发牌之间用一个延时函数隔开,保证系统时间有变化不久可以了?

我:- -b

三、给你十亿个数,如何找出其中最小的100个数?

我:(刚听完这个问题,我已经暗暗窃喜了,因为这个问题之前在其他地方已经看到过了) 于是镇定地回答,这个嘛,我知道,用堆排序就能迅速找出!

他:别告诉我堆排序,我要的是过程,整个过程,而不是一句提示。

我:好吧, 用这10亿个数中的前100个数先建立一个堆。(被打断)

他:别告诉我建一个堆,我要你建给我看,你怎么建!

我:。。。(只好拿出草稿纸,画了图比划给他看)建好了堆,而且是(大顶堆还是小顶堆?我思考了一下,马上说)大顶堆!,这样一来,堆顶就是这100个数中最大的那个了,是不是?

他:恩。

我:然后对于剩下的“10亿-100”个数,每个先和堆顶的元素比较大小,比堆顶大的数直接扔掉不要,比堆顶小的数把堆顶替换掉,然后进行一次堆的插入元素的算法,让新的100个数重新成为一个大顶堆,就这么继续下去,直到10亿-100个数都比较完,剩下还在堆里面的100个数就是10亿个数中最小的那100个了!

他:不错,那你觉得你的算法的复杂度咋样?

我:对于求n个数中的前m个最小的数而言,我先建堆,复杂度是O(m),而对于后面的(n-m)个数,最坏情况下每个数都要插入到堆中一次,堆中插入元素的算法时间复杂度最坏情况下是O(logm),所以最后是O(m)+(n-m)*O(logm)=O(m)+O((n-m)logm)=O((n-m)logm+m);

而如果是简单地先对10亿个数排序再取前100个的算法的话,即使用的是快排,那也是O(nlogn);

在n比m大这么多的前提下,显然算法复杂度不是一个数量级的~

四、有个10亿行*100列的二维字符数组,每行可以看成是一个字符串,怎么把这100亿个字符串按字典序排序?

我:&*¥(*palapala...

他:你理解错我的意思了,是这样的:¥……&&*)(

我:奥,这样啊,那可以这样做,因为10亿个字符串,内存肯定不够用,所以需要用到归并排序。

他:什么归并排序?

我:归并排序嘛,就是(*)&%%……

他:恩,然后呢?

我:反正有了归并排序后,只要先把每个分组各自排序,再归并就可以了,所以现在只讨论内存里可以放下的一个分组的排序,因为数量可能还是比较多,所以可以这样做:对于每一个字符串,维护其指针,根据每个字符串的第0列(也就是第一个元素)的大小对其指针进行排序,第0列相同的,就再比较第1列,第1列还是相同的,再比较第2列。。。

他:好吧。

面完了就差不多拿到了口头offer,我的处女面啊,虽然紧张了些,不过表现得还算可以了。

一个月后。。。

终于在一个不经意的时间才意识到了当初被面的各种问题的含义和用处!

首先是发牌问题,因为数据平台部门需要用到HTTP服务器,而这些HTTP服务器能够提供一种类似于反向代理的功能,所谓反向代理,和代理的功能刚相反。代理是将多个的,不同的用户的HTTP请求转交给WEB服务器,然后从WEB服务器端获得应答后,再把应答给用户;而反向代理则是将1个用户的HTTP请求分配给多个WEB服务器中的其中1个,也就是运行在WEB服务器集群前面的那个用于实现负载均衡和HTTP请求分配功能的那个。而这个反向代理的功能,就是类似于“发牌”,只不过它发的牌是用户的HTTP请求罢了!

其次是大数据量的排序、搜索信息等问题,这个是因为数据平台部门每天都要接触海量的数据,需要把大量日志等信息拉到数据仓库Hadoop上进行处理、数据挖掘等,这个数据传输、转存以及挖掘的过程就需要对大数据量运算的了解。

原文链接:http://www.cnblogs.com/DeadKnight/archive/2010/05/14/1735813.html

延伸阅读:

《编程之美》豆瓣

《编程之美》互动网

《编程之美》,IT人求职面试必读

淘宝item_sku-获取sku详细信息AIP接口(taobao.item_sku)布局技巧:3个技巧教你凸显商品sku亮点,高效提升转化! 淘宝的API接口是用于获取淘宝商品中SKU(Stock Keeping Unit,库存量单位)的详细信息的。SKU通常代表一个商品的不同属性组合,比如颜色、尺码等。对于商家和消费者来说,了解SKU的详细信息是非常重要的,因为它可以帮助他们更准确地了解商品的具体属性和库存情况。通过调用:包括SKU的颜色、尺码、款式等属性信息,这有助于用户了解每个SKU的具体差异。:每个SKU的当前库存量,这对于商家进行库存管理和消费者了解购买可行性非常关键。 阅读详情

相关推荐

淘宝、腾讯面试经历(软件测试)

<br />淘宝:淘宝笔试是最早的啦,愚人节那天晚上考的,笔试题不难,选择和填空都是一些c/c++ ,数据结构,计算机系统方面的基础题目,主观题考了一道智力题,然后就是算法题和程序题。考完心里也没底,想着反正也是去打酱油的,也没太在意,以为是4月12日出结果,等了一天没收到短信,心情非常低落,以为挂了,到了4月15日早上,珺珺说今天淘宝出结果,心里又燃起了一丝希望,到了下午接到了一个区号为0571的电话 ,原来是淘宝打过来的,跟我约下周一十点电话面试,我当时好开心啊,趁着周末好好准备了下,周一上午一直等着他

scutyan的专栏 6219

【后端开发】后端常见场景题

非开发科班生遇到喜欢问场景的面试官可太难了,基本秒跪。来临时抱抱佛脚,总结下常见场景面试题,部分是面试中遇到的,部分是网上搜集的。 重点——Redis 重点——MySQL 1. 怎么判别淘宝刷单?怎么检验手段效果? 2. 一亿个数据中找出最大的1000个? ...

咸粥的博客 1万+

算法经典面试题

算法经典面试题

【面试题】2018年最全Java面试通关秘籍第五套!

第一套:《2018年最全Java面试通关秘籍第一套!》第二套:《2018年最全Java面试通关秘籍第二套!》第三套:《2018年最全Java面试通关秘籍第三套!》第四套:...

Java后端技术 8856

告别手动归档:基于Allegro Skill的XTools一键生成Gerber与生产文件实践

本文详细介绍了基于Allegro Skill的XTools工具如何实现一键生成Gerber与生产文件,大幅提升PCB设计效率。通过自动化流程,解决了传统手动归档中的重复劳动、人为失误和标准不统一等问题,特别适合需要频繁输出生产文件的工程师。文章包含安装配置、实战操作、问题排查及进阶技巧,帮助用户快速掌握这一高效工具。

weixin_30505225的博客 461

从零搭建云手机:基于Docker与KVM的实战指南

本文提供了一份基于Docker与KVM从零搭建私有云手机的实战指南。详细介绍了服务器配置选择、KVM虚拟化环境检查、Docker容器部署以及通过VNC进行远程访问的全过程。该方案轻量高效,适合应用测试、手游多开及自动化脚本运行等场景,帮助用户低成本拥有高性能云端安卓设备。

weixin_29208327的博客 558

淘宝面试题4道

淘宝面试题4道 1、memcahe的分布怎么做?内部实现原理是啥?支持的最大内存是多少 2、为什么图片压缩后反而变大了,原理是啥 3、php的cgi为什么比加载模块慢,原理是啥 4、mysql是否有缓存?缓存机制是啥 ...

ddl_2014的博客 223

地平线天工开物AI开发平台实战:从量化训练到模型部署的完整指南

本文提供了地平线天工开物(OpenExplorer)AI开发平台的实战指南,详细解析了从量化训练到模型部署的完整流程。文章重点对比了量化感知训练(QAT)与训练后量化(PTQ)两条核心路径的优劣与适用场景,并分享了图像分类模型PTQ部署的实战经验与常见问题调试技巧,旨在帮助开发者高效地将AI模型部署到地平线AI芯片上。

weixin_29046035的博客 456

淘宝面试的几个算法题

一、给你1副扑克牌,你怎么发牌给4个人?  我:首先扑克牌可以排序,其次,可以每次产生1个随机数,然后把该随机数对应的牌发出去,每次发的牌轮流给第1个人、第2个人。。。  奥,不对,这样可能导致已经发出去的牌再次被发出去!  (进入沉思~)  他: Smilence... 我:(随即就给出可行的低效解) 可以这样嘛,首先声明,不考虑效率的前提下,可以这样做:把每张牌维护成一个结点,串联成一个...

乐在其中/Leo在其中 227

薄膜电容寿命预测全解析:从理论到实践,5步搞定可靠性评估

本文全面解析薄膜电容寿命预测的理论与实践,提供五步可靠性评估流程,涵盖温度应力、电压应力等关键因素分析,并分享提升寿命的实用技巧。特别适用于新能源、电动汽车等领域的设计工程师,帮助准确预测薄膜电容在实际工况下的使用寿命。

weixin_33712987的博客 432

5分钟搞定!用MCU GPIO实现零功耗一键开关机电路(附完整原理图)

本文详细介绍了如何利用MCU GPIO设计零功耗一键开关机电路,适用于便携式设备和电池供电项目。通过软硬件结合的方式,实现关机状态下的真正零功耗,同时提供智能开关机控制。文章包含完整原理图、元件选型指南和实际搭建技巧,帮助开发者在5分钟内完成高效电源管理方案。

weixin_28339967的博客 343

淘宝面试

淘宝和阿里的面试通常都是过了一面然后直接二面,如果他叫你等通知,基本就是挂了。 一面: 算法题: 1.按类似广义表的形式打印一个树 2.查找一个中间大的数(即除了该数外,一半比它大,另一半比它小) 解法: 1的问题直接深度优先遍历可解决 2的问题要想有好的时间复杂度的话,用堆解决 其他: 1.问了一些项目的问题,包括ext2== 2.常量指针和指针常量

一介码夫 896

数据分享|2023年OSM道路数据(全国,分省,分市)

首先这个工作非常有必要的,因为我们正常使用的道路的分类都是基于包括城市快速路、城市主干路、城市次干路这个体系的,大家对于这个分类体系应该更熟悉,但是OSM地图的道路分类又不是完全按这个来的,所以非常有必要重新分类;搞清楚道路类型是我们使用道路数据做很多工作的基础,比如我们在使用道路数据的时候,经常需要预估道路的行车速度,而这个速度一般就是根据道路类型来的,比如高架路的车速肯定就比城市支路快很多!下载分为两种情况,第一种是下载小区域的数据,比如下载一个街区的数据,第二种为下载整个中国范围的。

JData_Engineer的博客 4306

淘宝面试记

最过三个星期的面试,人生的第一次转折终于尘埃落定,虽然过程很平坦,但还是颇有感慨。 有喜就有悲,其中拒了四个公司的offer,其中有一家实在是不情愿,而且自己还有些失落,不过为了自己的目标,选择去杭州淘宝。人生就是这样,很多东西是缘分注定了的。 先说下我自己的情况,本人毕业三流二本大学,非计算机专业,因个人兴趣而走向java这条路,其中也经历过培训机构,但个人感觉培训机构教的太浅,而且更

dimly113的专栏 3万+

分享一个我自用的 Python 消息发送模块,支持邮件、钉钉、企业微信

🔥 分享一个我自用的 Python 消息发送模块,支持邮件、钉钉、企业微信

XiaoqiangClub的博客 478

【第一章】核心思维:那个在此刻“消失”的 CPU

摘要:RTOS本质是"有状态的抢占"而非"多任务",单核MCU通过时间片分时复用实现任务切换。裸机编程的线性思维在RTOS中不再适用,开发者需接受代码随时被打断的现实。RTOS通过保存/恢复CPU寄存器组(上下文)实现任务切换,每个任务拥有独立栈空间。非原子操作(如全局变量自增)会导致竞态条件,必须使用临界区或互斥锁保护。RTOS编程需要建立并发思维,关注代码原子性、可重入性和栈空间分配。

一路往蓝-Anbo 的博客 105

通过淘宝电话面试体会 (想去淘宝的童鞋可以参考)

简历投递出去的第三天,当我还在忙着手头上的项目的时候突然接到一个057开头的陌生电话,当时想都没想就跑出办公室接听了电话,还想问对方的身份的,在我之前电话那头就先做了介绍,说是淘宝的招聘人员,一听声音我就可以肯定,是一名比较年轻的boy,不过那边还是挺客气的,首先问了我是否方面接

心静思远 2935

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

淘宝购物新体验:taobao.item_search API接口助力精准关键字搜索

随着互联网的快速发展,网络购物已成为人们日常生活中不可或缺的一部分。作为中国最大的网络购物平台,淘宝以其丰富的商品种类和便捷的购物体验赢得了广大消费者的青睐。然而,面对海量的商品信息,如何快速、准确地找到自己需要的商品,一直是消费者关注的焦点。幸运的是,淘宝提供了taobao.item_search API接口,为消费者带来了全新的购物体验。taobao.item_search API接口是淘宝开放平台提供的一项服务,它允许开发者通过调用接口来获取淘宝平台上的商品信息。

api77的博客 669

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

面试算法题总结——引言

     昨天参加了淘宝的实习生招聘面试,由于自己没有好好准备,中间出现了好几次冷场,真是悲剧。。。。那个面试官应该也是技术人员,他问了我几个关于算法的问题,我勉强答了出来,但是我自己都感觉自己想出来的方法很笨,算法复杂度不够优。。。。估计这次面试要以悲剧收场了。。。。   面试过后,自己反思了一下,发现自己在算法方面很是薄弱,对里面的一些基础掌握的不够好。在计算机领域中流行着这样一种说法:计算机程序= 数据结构+ 算法,而且算法是程序的灵魂。对任何工程问题,当用软件来实现时,必须选取满足当前的资源限制

降龍 1102

华为、腾讯、淘宝面试流程+面试技术题分析,速看

(1)写出创建学生表表结构的语句,其中数据类型如下:S#-varchar(10),Sname- varchar(10) ,Sage- int,Ssex-char(2),约束如下:主键-学生编号,姓名非空。--1.学生表 Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生姓名,Sage 年龄,Ssex 学生性别。--2.课程表 Course(C#,Cname,T#) --C# --课程编号,Cname 课程名称,T# 教师编号。(2)查看服务程序占用的端口命令。

YJT1002的博客 1288

IBM 淘宝电话面试(转)

      IBM CDL 电话面试     2011年9月2日,偶然在学院的群里弹出一个IBM CDL的实习生招聘信息,看能力要求几乎也都符合,想着最近时间比较空闲就投了一份简历。记得曾在一篇文章上看到过,说是好多hr都不会下载附件来看简历信息,于是就直接把简历贴在了邮件的正文中,囧~ 幸亏IBM的人比较负责,又重新投了一份pdf格式的简历,因为可能会将简历发给经理查看。&lt;/p&gt;...

lvwenwen 206

北大硕士在阿里淘宝部门一面,已通过!

大家好,我是程序员小灰。在今年,小灰的一位读者在秋招提前批的时候,面试了阿里巴巴杭州base的淘宝部门,已顺利拿到offer。这位读者为了能帮助到更多程序员朋友,把阿里第一轮面试的过程详详细细做了记录和总结,希望大家能够从中获得启发。面试者背景介绍先大概说一下我的背景吧,本科211自动化专业,硕士Top2学校非科班,字节,京东两端大厂实习,一段侧重推荐算法开发,另一段Java后端开发,各4个月的实...

程序员小灰的博客 237

淘宝面试总结

<br />2011-4-16 淘宝实习生面试总结       上午9点半,到达了朝阳区的泰康金融大厦。进门就有HR给了一张表,要填写个人的详细情况,我勒个去还要问父母,以及家庭住址,淘宝你查户口的啊。<br />     <br />      10点钟的时候,一个感觉是个LEADER的面试官拿着我的简历叫了我的名字,随着他走进了办公司,面试正式开始。<br />     <br />     (1) 首先进行了一下2MIN的自我介绍,都是搞技术的,就照常说了下。<br />     (2) 然后就问了一

Challenge_C_PlusPlus的专栏 2365

2012淘宝面试经历

9月23号进行的,我在成都参见的。一天都搞完了,三次面试。一面很过瘾啊。拿到了淘宝的offer。希望给大家有些帮助吧。 1. 淘宝的笔试题目: http://blog.youkuaiyun.com/randyjiawenjie/article/details/6796275 2.

randyjiawenjie的专栏 3646
上一篇: 向往小小鸟的生活
下一篇: (转)在路上—Tinyfool的程序员生涯(职业生涯篇一)
BOPGroup
博客等级 码龄17年 2525粉丝 306原创
评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值