前言

这道面试题是我在博客园首页的一篇文章中看到的,面试题我简单的提取出来了,文章链接: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. ubuntu 安装redis以及phpredis

    一.安装redis 1. 去百度搜索 redis,然后去靠谱的地方下载最新的redisxxx.tar.gz 2. 解压后,sudo make 3. sudo make install 4. //安装完 ...

  2. cplusplus系列>utility>pair

    http://www.cplusplus.com/reference/utility/pair/ 用于存储一对异构对象 // Compile: g++ -std=c++11 pair.cpp #inc ...

  3. [ SHOI 2001 ] 化工厂装箱员

    \(\\\) \(Description\) 传送带上按顺序传过来\(N\)个物品,一个有\(A,B,C\)三类. 每次装箱员手里只能至多拿十个,然后将手中三类物品中的一类装箱,才能接着拿或接着装箱, ...

  4. 笔记《精通css》第5章 链接应用样式

    第5章    链接应用样式 1.链接伪类选择器 a : link{    }   (寻找没有被访问过的链接) a : visied{    }(寻找被访问过的链接) 动态伪类选择器 a : hover ...

  5. STL之string篇

    常用代码整理: #include<iostream> #include<cstdio> #include<cstring> #include<string&g ...

  6. 挂载硬盘,提示 mount: unknown filesystem type 'LVM2_member'的解决方案

    问题现象:由于重装linux,并且加了固态硬盘,直接将系统装在固态硬盘中.启动服务器的时候, 便看不到原来机械硬盘的挂载目录了,不知如何访问机械硬盘了.直接用命令 mount /dev/sda3 /s ...

  7. CSS——新浪导航demo

    主要运用的dispaly将a变成行内块,再用padding撑开宽度. <!DOCTYPE html> <html lang="en"> <head&g ...

  8. Codeforces_718A

    A. Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input sta ...

  9. 解决 i5 6500 安装黑苹果 Sierra 显卡不正常问题

    i5 6500内置HD 530显卡,装好Sierra显卡驱动不太正常. 先下载Clover configurator 用Clover configurator加载 EFI (Mount EFI)分区 ...

  10. Django - 数据获取

    Django - 数据获取 1.radio值获取 2.checkbox获取 3.select 获取 select 获取值,需要根据前端multiple来获取,get or getlist; 4.上传文 ...