题目
上周在浏览博客园的时候,看到了一道我比较感兴趣的题目,尝试的思考了下,觉得比较有意思,把周末思考的结果发上来和大家交流下。
看下面这个图片”
“在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”
“假如开始下雨了,那么墙之间的水坑能够装多少水呢?”
“以1×1 的方块为单位计算容积。所以,在上边的图中下标为 1 以左的都会漏掉。下标 7 以右的也会漏掉。剩下的只有在 1 和 6 之间的一坑水,容积是 10”
思考
首先我举得举一些可能的场景(测试用例?)比较好。于是简陋的画了一下:
转换成测试用例就是:
1. 测试数据:[6,0,8]
思考:最简单的用例,左边的墙低于右边,2个墙中间形成一个容器
期望结果:6
2. 测试数据:[4,8,0,8]
思考:右侧的墙永远不低于左侧;有连续的墙(不能形成容器);2个相等(相等的测试)的墙中间形成了容器
期望结果:8
3. 测试数据:[6,8,0,6]
思考:有连续的墙,并且右侧有一堵墙比左侧低
期望结果:6
4. 测试数据:[8,0,6]
思考:其实实际思考的时候,是第二个用例,和第一个对应
期望结果:6
5. 测试数据:[8,6,0,4]
期望结果:4
6. 测试数据:[8,4,0,6]
思考:最复杂的一个,第二个墙将来是在水下
期望结果:8
思考了下,测试覆盖的例子比较全了。但是感觉不太好,一些用例和另一些有重复的地方,还有一些极端情况(比如连续的墙但是形不成容器)没有画出来,单元测试的时候还可以增加一些测试。当然,输入长度为0的数组也要考虑到。
单元测试
[TestMethod]
public void Return_6_when_input_608()
{
var data = new int[3] { 6, 0, 8 };
Assert.IsFalse(6 == Interviewer.Instance.Compute(data));
}
其余略
附一个初始的代码:
public class Interviewer
{
public static Interviewer Instance = new Interviewer();
public int Compute(int[] data)
{
throw new NotImplementedException();
}
}
思考计算方法
运行了下单元测试,不出意外的出错了。测试驱动嘛,准备修改“BUG”。先想想怎么做。
形成容器需要2个墙,那么我们先从左侧开始出发,找到最左侧的第一个墙;然后从这个墙开始,向右侧开始寻找比它高,或者相等高度的墙;如果找到,那么这2个墙之间可能形成容器;如果没有比它高的墙,那么就找到右侧最高的墙,然后和他形成容器;2个形成容器之间的墙,取相对较矮的墙高度 X 间隔 - 中间包含墙的高度和。
然后推导一下:
1. [6,0,8] => 起始[0]6 => 找到右侧大于等于6的墙[2]8 => 取两者最矮的高度6 X 间隔1 - ([1]0) = 6 => 从[2]8开始继续向右寻找 => 没有下一个墙结束
结果为6,达到测试期望
2. [4,8,0,8] => 起始[0]4 => 找到右侧大于等于4的墙[1]8 => 取两者最矮的高度4 X 间隔0 - () = 0 => 从[1]8开始继续向右寻找 => 找到右侧大于等于8的墙[3]8 => 取两者最矮的高度8 X 间隔1 - ([2]0) = 8 => 从[3]8开始继续向右寻找 =>没有下一个墙结束
结果为8,达到测试期望
略去中间的推导...
6. [8,4,0,6] => 起始[0]8 => 找不到右侧大于等于8的墙 =>找到右侧最高的墙[3]6 => 取两者最矮的高度6 X 间隔2 - ([1]4) = 8 => 从[3]6开始继续向右寻找 =>没有下一个墙结束
结果为8,达到测试期望
总的来说,推导结果还比较满意。最后测试一下题目:
[2,5,1,2,3,4,7,7,6]
a) 起始[0]2
b) 找到右侧大于等于2的墙[1]5
c) 取两者最矮的高度2 X 间隔0 - () = 0
d) 从[1]5开始继续找到[6]7,得到 5 X 4 - (1+2+3+4) = 10
e) 从[6]7开始继续找到[7]7,等到 7X 0 - () = 0
f) 从[7]7开始继续找到[8]6,等到 6X 0 - () = 0
最后把结果累加:得到10
代码实现
略
收获
最大的收获其实是温习了一遍测试驱动开发,这个题目感觉最大的考点在准备测试用例上,整个计算方法没有什么太大的难度。
尾声
更详细的测试没有做,测试用例思考的不是太好。附上原博客,其实里面已经有解决方法了。一会儿把自己做的和他的答案比较下。
http://news.cnblogs.com/n/192014/