前言

这道面试题是我在博客园首页的一篇文章中看到的,面试题我简单的提取出来了,文章链接: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. js addeventlistener 刮刮贴

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  2. [Swift通天遁地]四、网络和线程-(6)检测网络连接状态

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. AcWing算法基础1.3

    二分 二分分为整数二分和实数二分,其中整数二分模板有两个 模板: 整数二分模板 第一种模板将区间分为[ l , mid ]  和 [ mid + 1, r ] int bsearch_1(int l, ...

  4. Java初级面试模拟1

    1.简单介绍一下你的项目,说一下项目有什么模块 2.说说常见的集合有哪些吧 答:Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List ...

  5. Educational Codeforces Round 24 题解

    A: 考你会不会除法 //By SiriusRen #include <bits/stdc++.h> using namespace std; #define int long long ...

  6. 51nod 1577 线性基

    思路: http://blog.csdn.net/yxuanwkeith/article/details/53524757 //By SiriusRen #include <bits/stdc+ ...

  7. MYSQL创建用户和授权方法(测试mysql5.7)

    一.创建用户:  命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指 ...

  8. 个人作业——Alpha项目测试

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/ 这个作业要求在哪里 https://edu.cnbl ...

  9. [Android]异常2-Unexpected error while executing

    异常原因: 可能一>Android Studio的自动编译没有成功 解决方法有: 解决一>菜单栏里的“Build”,“Clean Project” 注:

  10. JS——祝愿墙

    注意事项: 1.for循环的下一层注册了事件的话,事件函数中关于变量i的节点元素是不允许出现的,因为在函数加载的时候,只会加载函数名,不会加载函数体,外层for循环会走完一边,变量i一直会停留在最后一 ...