一道Twitter面试题的解答
前言
这道面试题是我在博客园首页的一篇文章中看到的,面试题我简单的提取出来了,文章链接:http://news.cnblogs.com/n/192014/。
在我用JS实现了我自己的想法之后,我再一次看了这篇文章。在这篇文章的评论里,我惊喜的发现,有些大牛给出了更好的思路,
我会备注在这篇文章的后面,也可以直接去看原文的评论。博客园大牛还是很多的,程序猿是很聪明的群体。:):)
面试题
一个平面上有很多墙,高度参差不齐,每堵墙平行挨着,如下图所示,
计算如下所示的图墙可装水量,框里面的数字代表墙的高度

具体实现
1.可以先试着思考下怎么做:)
2.用JS实现的
/**
* 思路:
* 1.确定可装水的区域
* 区域满足如下条件才可装水:
* a. 必须包含至少三堵墙
* b. 最左(右)侧的墙的高度必须小于另外一侧
* c. 非最外侧的墙的高度一定小于或者等于最外侧墙中最小的高度的墙
* 2.计算可装水区域内某堵墙可装水的容积volume
* 3.计算可装水区域内所有墙可装水容积之和
* 4.计算所有可装水区域容积之和
*
* 实现:
* 1 找出最高墙的位置 iMaxIdx
* 2 从左至右计算可装水容积 V1 直至第iMaxIdx堵墙
* 3 从右至左计算可装水容积 V2 直至第iMaxIdx堵墙
* 4 总的可装水容积:V1+V2
*/
var aWallH = [2,5,1,2,3,4,7,7,6]; //所有墙的高度
var iWallW = 1; //墙宽度
var iWallL = 1; //墙长度
var iTotalV = 0; //总可装水容积
var iMaxWallIdx = 0; //最高墙的位置
var getMaxIdx = function(aO){ //找出最高墙的位置
var iMax = 0,iIdx = 0;
for (var i = 0; i < aO.length; i++){
if (iMax < aO[i]){
iMax = aO[i];
iIdx = i;
}
}
return iIdx;
};
var calVolume = function(aO,start,end,x,w,l){ //计算可装水容积
var iLeftH = 0;
var iAreaV = 0;
var iTotalV = 0;
var i = start;
for (; (x == 1) ? (i <= end) : (i >= end); i = i + x){
if (iLeftH < aO[i]){
iLeftH = aO[i];
} else {
break;
}
}
for (; (x == 1) ? (i <= end) : (i >= end); i = i + x){
if (iLeftH > aO[i]){
iAreaV += (iLeftH - aO[i]) * w * l;
} else {
iLeftH = aO[i];
iTotalV += iAreaV;
iAreaV = 0;
}
}
return iTotalV;
}
iMaxWallIdx = getMaxIdx(aWallH);
iTotalV += calVolume(aWallH,0,iMaxWallIdx,1,iWallW,iWallL);
iTotalV += calVolume(aWallH,aWallH.length-1,iMaxWallIdx,-1,iWallW,iWallL);
console.log(iTotalV);
博客园大牛给出的更好的思路
还是折叠吧:):)
/*
* 第7楼osold发表于 2013-11-01 14:06
* 这个其实对应图形学里面的一个扫描线填充算法。
*用那个算法实现比较简单。
*/ /*
*
备注:此方法有问题! 第12楼Kalou发表于 2013-11-01 17:12
*将n个点按顺序连接成折线,分别计算每2个点之间的高度差,
*当遇到第一个负数时,表示可能开始收集到水,与后面的数相加,
*知道大于0,此区间*代表能收集到水。依次类推。例如
*10块砖的高度分别为[2,5,1,3,1,2,1,7,7,6],
*此时他们之间的距离分别为 [+3,-4,+2,-2,+1,-1,+6,+0,-1],
*第一个负数为-4,代表5这里可能开始**收集到水,
*然后向下遍历,-4+2《=0,-4+2-2《=0,-4+2-*2+1《=0,-4+2-2+1-1《=0,-4+2-2+1-1+6》0,
*这里终止,代表*收集雨水区域为[5,1,3,1,3,1,7] */
后记
1. js功能很强并执行方便,所以我选择了JS实现。
2.思路都是相同的,用其他语言一样可以实现,这个看个人的喜好。
3.实现思路就可以称之为算法吧,不只局限排序 :)
4.有空多思考,多训练,否则长久下去,思维会变迟钝。
一道Twitter面试题的解答的更多相关文章
- 一道Twitter面试题
在微博上看到的这个问题,忍住没看答案自己解决了.建议没看过的同学也自己先尝试下. “看下面这个图片” 在这个图片里我们有不同高度的墙.这个图片由一个整数数组所代表,数组中每个数是墙的高度.上边的图可以 ...
- Java面试题和解答(五)
1.在Java中Executor和Executors的区别? Executor是线程池的顶层接口,它的实现类如下图所示: Executors是一个类,提供了多个静态方法,用于生成不同类型的线程池,如下 ...
- 一道 JavaScript 面试题
有一道 JavaScript 面试题. f = function () { return true; }; g = function () { return false; }; (function() ...
- 一道sql面试题(查询语句)
一道sql面试题(查询语句) id name age 1 a 11 2 b 11 3 c 12 4 d 13 5 e ...
- Microsoft 2013校园招聘笔试题及解答
Microsoft 2013校园招聘笔试题及解答 题目是自己做的,求讨论.吐槽.拍砖 1. Which of the following callingconvension(s) suppo ...
- 一道经典面试题-----setTimeout(function(){},0)
一道经典面试题-----setTimeout(function(){},0) 转载: http://www.w3cfuns.com/notes/17398/e8a1ce8f863e8b5abb5300 ...
- 一道Python面试题
无意间,看到这么一道Python面试题:以下代码将输出什么? def testFun(): temp = [lambda x : i*x for i in range(4)] return ...
- 【转载】JAVA常见面试题及解答(精华)
JAVA常见面试题及解答(精华) 1)transient和volatile是java关键字吗?(瞬联) 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: ...
- new与属性访问的顺序,从一道JS面试题说起
这段时间一直在研究设计模式,在看工厂模式的时候,看到一段代码 VehicleFactory.prototype.createVehicle = function ( options ) { if( o ...
随机推荐
- NOI2015 软件包管理器(树链剖分+线段树)
P2146 软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决 ...
- RHEL6.5安装成功ORACLE11GR2之后,编写PROC程序出错解决方法
1. proc: error while loading shared libraries: libclntsh.so.11.1: cannot open shared object file: N ...
- python中的深拷贝和浅拷贝(面试题二)
一.浅拷贝 定义:浅拷贝只是对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值. 浅拷贝的特点: 公用一个值: 这两个变量的内存地址一样: 对其中一个变量的值改变,另外一个变量的值也 ...
- [转]linux之ps命令
转自:http://www.cnblogs.com/peida/archive/2012/12/19/2824418.html Linux中的ps命令是Process Status的缩写.ps命令用来 ...
- 一键生成Spring MVC + MyBatis + maven项目
首先创建一个新的maven项目,在src/main/java创建一个类Test 然后在Test复制以下代码: import java.io.*; import java.sql.Connection; ...
- firefox 附加组件栏安装
firefox 在升级到 30的版本后,发现附加组件栏不兼容了. 搜索组件,add-on bar 会得到一个 new add-on bar的组件,安装完后发现上面不显示ip, 后来才发现,应该安装Th ...
- Spring.net(v1.3.2) 官网API-第一章 前言
虽然有很好的工具和技术,但是开发软件应用仍然是很困难的.Spring为构建企业级应用提供了一个轻量级的解决方案,Spring提供了一个统一的.透明的方式去配置你的应用,和将AOP集成到你的软件中.Sp ...
- 背包系列 hdu 3535 分组背包
题意: 有n组工作,现在有T分钟时间去做一些工作.每组工作里有m个工作,并且类型为s,s类型可以为0,1,2,分别表示至少选择该组工作的一项,至多选择该工作的一项,不限制选择.每个工作有ci,gi两个 ...
- SQL基本操作——日期函数
SQL日期:当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配.只要数据包含的只是日期部分,运行查询就不会出问题.但是,如果涉及时间,情况就有点复杂了.在讨论日期查 ...
- Nginx 反向代理并缓存及缓存清除
Nginx 反向代理并缓存及缓存清除 原文地址:http://www.cnblogs.com/caoguo/p/5012447.html 一. Nginx 配置 #user nobody; worke ...