题目

    上周在浏览博客园的时候,看到了一道我比较感兴趣的题目,尝试的思考了下,觉得比较有意思,把周末思考的结果发上来和大家交流下。

    看下面这个图片”

   周末思考的面试题

    “在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[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/

相关文章:

  • 2021-12-30
  • 2021-06-23
  • 2022-01-31
  • 2022-12-23
  • 2022-12-23
  • 2021-09-22
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-04-27
  • 2022-02-24
  • 2021-09-11
  • 2021-07-02
  • 2021-08-10
  • 2021-07-21
相关资源
相似解决方案