前言

这道面试题是我在博客园首页的一篇文章中看到的,面试题我简单的提取出来了,文章链接: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面试题的解答的更多相关文章

  1. 一道Twitter面试题

    在微博上看到的这个问题,忍住没看答案自己解决了.建议没看过的同学也自己先尝试下. “看下面这个图片” 在这个图片里我们有不同高度的墙.这个图片由一个整数数组所代表,数组中每个数是墙的高度.上边的图可以 ...

  2. Java面试题和解答(五)

    1.在Java中Executor和Executors的区别? Executor是线程池的顶层接口,它的实现类如下图所示: Executors是一个类,提供了多个静态方法,用于生成不同类型的线程池,如下 ...

  3. 一道 JavaScript 面试题

    有一道 JavaScript 面试题. f = function () { return true; }; g = function () { return false; }; (function() ...

  4. 一道sql面试题(查询语句)

    一道sql面试题(查询语句)   id name age 1  a        11 2  b        11 3  c        12 4  d        13 5  e        ...

  5. Microsoft 2013校园招聘笔试题及解答

    Microsoft 2013校园招聘笔试题及解答 题目是自己做的,求讨论.吐槽.拍砖 1.      Which of the following callingconvension(s) suppo ...

  6. 一道经典面试题-----setTimeout(function(){},0)

    一道经典面试题-----setTimeout(function(){},0) 转载: http://www.w3cfuns.com/notes/17398/e8a1ce8f863e8b5abb5300 ...

  7. 一道Python面试题

    无意间,看到这么一道Python面试题:以下代码将输出什么? def testFun():    temp = [lambda x : i*x for i in range(4)]    return ...

  8. 【转载】JAVA常见面试题及解答(精华)

     JAVA常见面试题及解答(精华)       1)transient和volatile是java关键字吗?(瞬联) 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: ...

  9. new与属性访问的顺序,从一道JS面试题说起

    这段时间一直在研究设计模式,在看工厂模式的时候,看到一段代码 VehicleFactory.prototype.createVehicle = function ( options ) { if( o ...

随机推荐

  1. [App Store Connect帮助]三、管理 App 和版本(2.3)输入 App 信息:提供自定许可协议

    Apple 提供了适用于所有地区的标准 EULA(最终用户许可协议).如果您不提供自定许可协议,则您的 App 会应用标准 Apple EULA,且该许可协议链接不会显示在您的 App Store 产 ...

  2. Akka源码分析-local-DeathWatch

    生命周期监控,也就是死亡监控,是akka编程中常用的机制.比如我们有了某个actor的ActorRef之后,希望在该actor死亡之后收到响应的消息,此时我们就可以使用watch函数达到这一目的. c ...

  3. 题解报告:hdu 1863 畅通工程

    Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可 ...

  4. 326 Power of Three 3的幂

    给出一个整数,写一个函数来确定这个数是不是3的一个幂.后续挑战:你能不使用循环或者递归完成本题吗? 详见:https://leetcode.com/problems/power-of-three/de ...

  5. [转]linux下ulimit命令详解

    转自:http://blog.chinaunix.net/uid-23842323-id-2656582.html 1,说明:ulimit用于shell启动进程所占用的资源.2,类别:shell内建命 ...

  6. Hadoop Hive概念学习系列之hive与依赖环境的交互(二十一)

    hive与环境的交互,算是一个小知识点,但掌握不菲! 如何在hive里,也达到这样呢? 不需要这样啦,因为,hive是建立在hadoop之上,启动hive,相当于,就是,hadoop jar ** h ...

  7. [Android]异常4-javax.mail.AuthenticationFailedException

    javax.mail.AuthenticationFailedException 背景:JavaMail发送电子邮件 异常原因: 可能一>发件人帐号.密码有误 可能二>需要使用SSL安全认 ...

  8. MYSQL 使用自定义表变量

    mysql  用户自定义表变量,ENGINE=MyISAM DEFAULT CHARSET=gb2312; 制定编码方式,防止乱码 DROP TABLE IF EXISTS p_temp; creat ...

  9. webstorm进行VisualSVN配置及上传项目到项目库

    以前建站一直都是自己一个人,最近要做一个比较大的网站,寻思着利用svn在整个开发过程中会比较快,于是摸索着配置了一下. 首先,下载VisualSVN这个软件,官网链接 https://www.visu ...

  10. 检索COM类工厂中CLSID 为 {000209FF-0000-0000-C000-000000000046}的组件时失败, 原因是出现以下错误: 80070005

    主要问题原因是Word权限配置问题 解决方案: 控制面板-管理工具-组件服务-计算机-我的电脑-DCOM配置 在列表中找到microsoft word97-2003 document 右键选择属性,选 ...