一道Twitter编程面试题
2013-11-14 11:32
316 查看
Twitter面试题:水沟积水问题
问题描述:“看下面这个图片”
![](http://ww1.sinaimg.cn/mw690/7cc829d3gw1ea56snnnkzj205m03z744.jpg)
“在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”
“假如开始下雨了,那么墙之间的水坑能够装多少水呢?”
思路分析: 一种只需要一次遍历的方法(注:不知道算不算动态规划算法,请知道的高人鉴定一下)
1. 首先,用两个指针(left 和 right)分别指向数组的第一个元素和最后一个元素,左指针从左向右遍历,右指针从右向左遍历;
2. 初始化数组中一个元素(a[0])为左边遍历得到的最大值(max_left),最后一个元素(a[a.length-1])为从右边遍历得到的最大值(max_right);
3. 开始遍历,遍历条件为左指针小于右指针
4. 如果左边遍历的最大值小于右边遍历的最大值,说明只要有水沟(即小于左边最大值max_left的元素)就会有积水,因为右边的最大值可以保证左边水沟的积水不会流失掉;
同样,如果左边遍历的最大值不小于右边遍历的最大值,只要右边有水沟(即小于右边最大值max_right的元素)就会有积水。
解决方案:Java实现代码
测试代码:
此面试题是前几天在CSDN的极客头条版看到的,在这里把问题以及思路自己整理了一遍,并用Java实现了!面试题分析:我的Twitter面试技术面试失败了点击打开链接
问题描述:“看下面这个图片”
![](http://ww1.sinaimg.cn/mw690/7cc829d3gw1ea56snnnkzj205m03z744.jpg)
“在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”
“假如开始下雨了,那么墙之间的水坑能够装多少水呢?”
思路分析: 一种只需要一次遍历的方法(注:不知道算不算动态规划算法,请知道的高人鉴定一下)
1. 首先,用两个指针(left 和 right)分别指向数组的第一个元素和最后一个元素,左指针从左向右遍历,右指针从右向左遍历;
2. 初始化数组中一个元素(a[0])为左边遍历得到的最大值(max_left),最后一个元素(a[a.length-1])为从右边遍历得到的最大值(max_right);
3. 开始遍历,遍历条件为左指针小于右指针
4. 如果左边遍历的最大值小于右边遍历的最大值,说明只要有水沟(即小于左边最大值max_left的元素)就会有积水,因为右边的最大值可以保证左边水沟的积水不会流失掉;
同样,如果左边遍历的最大值不小于右边遍历的最大值,只要右边有水沟(即小于右边最大值max_right的元素)就会有积水。
解决方案:Java实现代码
public class Twitter_puddle { public int caculate(int[] a) { if (a == null) return 0; int left = 0; int right = a.length - 1; int max_left = a[left]; int max_right = a[right]; int volume = 0; while (left < right) { if (max_left < max_right) { left++; if (max_left < a[left]) { max_left = a[left]; } else { volume += max_left - a[left]; } } else { right--; if (max_right < a[right]) { max_right = a[right]; } else { volume += max_right - a[right]; } } } return volume; } }
测试代码:
import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import static org.hamcrest.Matchers.*; public class Twitter_puddleTest { private Twitter_puddle puddle; @Before public void before() { puddle = new Twitter_puddle(); } @Test public void testNull() { assertThat(puddle.caculate(null), is(0)); } @Test public void testOne() { int a[] = {1}; assertThat(puddle.caculate(a), is(0)); } @Test public void testTwoRightHigher() { int a[] = {1, 2}; assertThat(puddle.caculate(a), is(0)); } @Test public void testTwoLeftHigher() { int a[] = {2, 1}; assertThat(puddle.caculate(a), is(0)); } @Test public void testTwoSameHight() { int a[] = {1, 1}; assertThat(puddle.caculate(a), is(0)); } @Test public void testThreeMiddleHigher() { int a[] = {1, 2, 1}; assertThat(puddle.caculate(a), is(0)); } @Test public void testThreeMiddleLower() { int a[] = {2, 1, 2}; assertThat(puddle.caculate(a), is(1)); } @Test public void testThreeSameHeight() { int a[] = {1, 1, 1}; assertThat(puddle.caculate(a), is(0)); } @Test public void testRandom1() { int a[] = {2, 5, 1, 2, 3, 4, 7, 7, 6}; assertThat(puddle.caculate(a), is(10)); } @Test public void testRandom2() { int a[] = {2, 5, 1, 3, 1, 2, 1, 7, 7, 6}; assertThat(puddle.caculate(a), is(17)); } @Test public void testRandom3() { int a[] = {6, 1, 4, 6, 7, 5, 1, 6, 4}; assertThat(puddle.caculate(a), is(13)); } @Test public void testRandom4() { int a[] = {6, 6, 6, 6, 6, 6, 6, 6, 6}; assertThat(puddle.caculate(a), is(0)); } }
相关文章推荐
- 又一道编程面试题
- 一道无关编程的面试题
- 一道JAVA编程面试题
- 一道“坑爹”的编程面试题
- 编程挑战-一道淘汰85%面试者的百度开发者面试题
- 记一道有趣的Twitter面试题
- 一道有趣的Twitter技术面试题
- 对一道Twitter面试题(墙面盛水问题)的解答
- 华为面试题——一道关于指针方面的编程题(C/C++)
- 一道Twitter面试题的解答
- 【一道有趣的Twitter技术面试题】的个人思路
- 一道面试题(Nim取子游戏)——如何将数学思维应用到编程中
- 华为面试题——一道关于指针方面的编程题(C/C++)
- 一道Twitter面试题
- 华为面试题——一道关于指针方面的编程题(C/C++)
- 一道Hadoop面试题MapReduce编程,oh no,用了一下午来源码实现
- 一道JAVA编程面试题
- [置顶] 又一道编程面试题
- 有趣的积水问题(Twitter编程面试题)
- 一道Java面试题之实现复制、删除、剪切文件(文件夹的实现)的snippet