对一道Twitter面试题(墙面盛水问题)的解答
来源:互联网 发布:如何在淘宝上代写作业 编辑:程序博客网 时间:2024/06/11 18:24
最近同学在刷一些面试题,其中有一道Twitter的题目很有意思:
看下面这个图片”
“在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”
“假如开始下雨了,那么墙之间的水坑能够装多少水呢?”
我的算法思路如下:
将水坑中的水按照水平方向进行切分,划分成若干“横向水条”,如下图所示(手画的图,有点丑):
1.采用遍历的方法,依次遍历数组中的每个数字(从第2个元素遍历到倒数第2个元素);
2.对于当前数字temp,向前(下标递减方向)找到第一个比当前数字大的数,记为high1,再向后(下标递增方向)找到第一个比当前数字大的数,记为high2;
3.比较high1和high2中,记其中的小的数字为hi;
4.通过计算hi和temp之间的“横向水条的面积”,最后相加
5.其中mark是为了避免对同一高度的水条进行多次计算。。
具体实现代码如下:
#include <stdio.h>int water(int a[], int len){int hi,high1,high2,temp,wat,index1,index2,sum=0;int mark[100]; //该数组用于标识墙所在高度的行是否已被装水for(int i=0;i<100;i++)mark[i]=0; //标识为0表示还未被装水for(int j=1;j<len-1;j++){high1=-1;high2=-1;if(mark[j]==1)continue;temp=a[j];for(int k=j+1;k<len;k++){if(a[k]<temp)continue;else if(a[k]==temp){mark[k]=1;continue;}else{high1=a[k];index1=k;break;}}for(int m=j-1;m>=0;m--){if(a[m]<=temp)continue;else{high2=a[m];index2=m;break;}}if(high1==-1||high2==-1)continue;hi=high1;if(high2<hi)hi=high2;wat=(hi-temp)*(index1-index2-1);sum=sum+wat;}return sum;}void main(){int a[10]={2,5,1,3,1,2,1,7,7,6};int result=water(a,10);printf("%d",result);}
0 0
- 对一道Twitter面试题(墙面盛水问题)的解答
- 一道面试题的解答
- 一道微软面试题的解答【镜子问题】
- 一道面试题的解答_骑士获得金币问题
- 华为的一道面试题的解答
- 一道有意思的面试题的解答
- 解答Google的一道面试题
- 解答Google的一道面试题
- 关于一道微软面试题的解答
- 关于一道面试题的源代码解答
- 百度一道面试题的PHP解答
- 解答Google的一道面试题 收藏
- 一道C语言面试题的解答
- 一道微软面试题的解答
- 一道sql面试题的解答
- 解答Google的一道面试题
- 解答Google的一道面试题
- 解答Google的一道面试题 .
- JavaScript面向对象的编程
- Unity3D基础--动态创建和设置游戏对象
- UriMatcher
- intelliJ IDEA 创建maven android工程的方法
- Xcode6中添加pch文件
- 对一道Twitter面试题(墙面盛水问题)的解答
- digitalClock&AnalogClock
- 灰度图像
- 彻底理解ThreadLocal
- 深度学习研究理解9:Convolutional Neural Networks at Constrained Time Cost
- mysql闪退问题分析和解决
- 百度地图sdk---地图定位功能的错误has leaked ServiceConnection com.baidu.location.LocationClient
- android后台截屏实现(3)--编译screencap
- Android onTouchEvent, onClick及onLongClick的调用机制