一道有趣的Twitter技术面试题
来自:http://blog.jobbole.com/50705/
看下面这个图片”

“在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”
“假如开始下雨了,那么墙之间的水坑能够装多少水呢?”

“以1×1的方块为单位计算容积。所以,在上边的图中下标为1以左的都会漏掉。下标7以右的也会漏掉。剩下的只有在1和6之间的一坑水,容积是10”
---------------------------------------------------------------
我大概用了30分钟想到了解法,但是翻译成可执行代码用了大半天.
原因一是我的思维过程其实包含了大量的默认判断,对于人脑很自然,但是对于机器就得一一明确指出.
二是我一开始设计了个复杂的数据结构,导致测试过程中的索引让我头脑混乱.后来肉眼观察代码的字符规律,发现完全可以用一个简单的数组代替...肉眼发起的优化啊= =..
为什么会犯这种错误,因为一开始我有种多多益善的倾向,把衍生数据和原始数据都放到一个元组里面吧,万一哪个地方所有数据都需要呢?
下面是我的解法.思路是先将这些墙按其高度从高到低排列形成一个新表arr2,arr2的数据本身不是高度,而是这个高度在arr中的索引.然后再遍历arr2,检查两墙之间能累积多少水.
代码:
arr=[2, 5, 1, 2, 3, 4, 7, 7, 6] def waterWall(arr):
#print arr
#print arr2
#[2, 5, 1, 2, 3, 4, 7, 7, 6]
#[7, 6, 8, 1, 5, 4, 3, 0, 2] def calWater(big,sml):
#根据传入的2个墙的索引值计算它们之间的水容量
#水容量是由较矮的墙决定的
shorter=min(arr[sml],arr[big])
return sum((shorter-mid for mid in arr[sml+1:big]))
#按墙高倒序排列的索引值数组,最左边的成员表示最高的墙的索引值,以此类推
arr2=map(lambda x:x[1],
sorted(((k,i) for i,k in enumerate(arr)),
reverse=1))
#已检查的区域,用于控制计算以及退出循环
ckdRange=[]
#总水量
waterVol=0 end=len(arr2)-1 #首次循环是计算2个成员,以便初始化区域
#之后的循环将成员sml和ckdRange的上下界比较
for i in range(end):
big,sml=arr2[i],arr2[i+1]
#如果是首次循环,那么初始化ckdRange和水量
if not ckdRange:
#墙更高不一定索引更大,保证sml指代较小数,简化判断
if sml>big:
sml,big=big,sml
#传入两墙的索引,开始累积水量
waterVol+=calWater(big,sml)
#初始化已检查的区域
ckdRange.extend([sml,big])
elif sml>ckdRange[1]:
waterVol+=calWater(sml,ckdRange[1])
ckdRange[1]=sml
elif sml<ckdRange[0]:
waterVol+=calWater(ckdRange[0],sml)
ckdRange[0]=sml
#如果区域已经覆盖全部成员,那么退出循环
#最极端的情况是arr首尾成员是最高墙时,只需迭代一次就退出 #print 'range checked:',ckdRange,'water:',waterVol
if ckdRange==[0,end]:
break
#返回最终水量
return waterVol print waterWall(arr)
一道有趣的Twitter技术面试题的更多相关文章
- 记一道有趣的Twitter面试题
微信上的“程序员的那些事”想必是很多码农们关注的公众账号之一,我也是其粉丝,每天都会看看里面有没有什么趣事,前段时间“程序员的那些事”分享了一篇博文<我的Twitter技术面试失败了>挺有 ...
- .NET技术面试题系列(1) 基础概念
这是.NET技术面试题系列第一篇,今天主要分享基础概念. 1.简述 private. protected. public.internal 修饰符的访问权限 private : 私有成员, 在类的内部 ...
- 最新阿里Java技术面试题,看这一文就够了!
金三银四跳槽季即将到来,作为 Java 开发者你开始刷面试题了吗?别急,小编整理了阿里技术面试题,看这一文就够了! 阿里面试题目目录 技术一面(基础面试题目) 技术二面(技术深度.技术原理) 项目实战 ...
- 阿里、华为、腾讯Java技术面试题精选
阿里.华为.腾讯Java技术面试题精选 2017-10-27 19:30技术/腾讯/华为 JVM的类加载机制是什么?有哪些实现方式? 类加载机制: 类的加载指的是将类的.class文件中的二进制数据读 ...
- 一道关于String的面试题,新鲜出炉,刚被坑过,趁热!!
很多人都会答错的一道关于String的题目,究竟有什么难度? 我们一起来看一道关于String的面试题,准确说是改编的面试题! 准备好啦?在放大招之前先来一个小招式 String s1 = new S ...
- 一道有趣的for循环题
一道有趣的for循环题 今天在复习js基础知识时发现了一个for循环的题,第一眼看到直接懵逼了,没想到for循环竟然还可以这样玩?涨姿势了. 题目是这样的 for(i=0, j=0; i<10, ...
- codeforces 1451D,一道有趣的博弈论问题
大家好,欢迎来到codeforces专题. 今天选择的问题是Contest 1451场的D题,这是一道有趣简单的伪博弈论问题,全场通过的人有3203人.难度不太高,依旧以思维为主,坑不多,非常友好. ...
- Java实习生常规技术面试题每日十题Java基础(八)
目录 1.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法. 2.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 3.运行时异常与受检异常有 ...
- Java实习生常规技术面试题每日十题Java基础(七)
目录 1. Java设计模式有哪些? 2.GC是什么?为什么要有GC? 3. Java中是如何支持正则表达式. 4.比较一下Java和JavaSciprt. 5.Math.round(11.5) 等于 ...
随机推荐
- [LeetCode] Output Contest Matches 输出比赛匹配对
During the NBA playoffs, we always arrange the rather strong team to play with the rather weak team, ...
- C#标记 [已弃用] 的方法
[Obsolete]//标记该方法已弃用 /// <summary> /// 你应该调用本类的 OpenMessageBox 方法 /// </summary> public ...
- php文件包含漏洞(input与filter)
php://input php://input可以读取没有处理过的POST数据.相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置.php:/ ...
- ftp爆破(python脚本)
最近在乌云看到一份端口详解:为了锻炼自己,按照端口详解写脚本 #!/usr/local/bin/ python #-*- coding: UTF-8 -*- __author__ = '' from ...
- 教你从手机中提取system镜像制作线刷救砖包的简单方法
其实在制作刷机包的过程中,有时候没有官方或者第三方提供的救砖包(线刷),那怎么办?常规的方法有两种:(此处为常规方法,回读的方式暂不说明) 1.卡刷包转线刷包 2.dd命令导出分区镜像 ...
- [HNOI 2011]数学作业
Description 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Con ...
- ●BZOJ 1492 [NOI2007]货币兑换Cash
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1492 题解: 斜率优化DP,CDQ分治 定义$DP[i]$为第i天结束后的最大收益. 由于题 ...
- ●洛谷 P3616 富金森林公园
题链: https://www.luogu.org/problemnew/show/3616 题解: 树状数组,,, 本题思路挺巧妙. 考虑这种暴力算法:(设H[i]为i位置的高度,水面的高度为B) ...
- 2015多校联赛 ——HDU5288(数学)
OO’s Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- bzoj4361isn 容斥+bit优化dp
4361: isn Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 375 Solved: 186[Submit][Status][Discuss] ...