《我的twitter技术面试失败》中墙之间水坑装水问题的更烂解法(Java解)

来源:互联网 发布:程序员 欣欣 编辑:程序博客网 时间:2024/05/17 01:34

“看下面这个图片”

“在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”

“假如开始下雨了,那么墙之间的水坑能够装多少水呢?”

“以1×1的方块为单位计算容积。所以,在上边的图中下标为1以左的都会漏掉。下标7以右的也会漏掉。剩下的只有在1和6之间的一坑水,容积是10”

想想这个输入:

********************************************************************************************************************************

以上是原文的一部分,

说下我的思路:首先遍历数组,当前一个数大于后一个数时,满足了“坑”的一半要求,这时候需要寻找之后数组中的最大数与之组成一个“坑”,获取最大数的下标与“坑”左边的下标得出距离,然后取“坑”边高度较低的数得出面积再减去“坑”中突出部分的面积就是雨水的面积了。下一次循环就是从这个最大数的下标开始找“坑”直到结束。

以下是用Java实现(新手第一次写,确实很烂):

public class Test {
public static void main(String[] args) {
int sa=0;//要求的面积
int arr[]={2,5,1,3,1,2,1,7,7,6};
for(int i=0;i<arr.length-2;i++){//遍历数组
if(arr[i]>arr[i+1]){//左边符合“坑”的条件时去寻找右边的最大值
int max=arr[i+2];//右边最大值
int down=i+2;//右边最大值下标
for(int j=i+3;j<arr.length;j++){//遍历剩余的数组,寻找最大值
if(max<arr[j]){
max=arr[j];
down=j;
}
}

int s=0;//突出面积
for(int k=i+1;k<down;k++){//“坑”中突出的部分合起来的面积
s=arr[k]+s;
}
if(max>arr[i]){//右边比左边高的情况下
sa=(arr[i]*(down-i-1)-s)+sa;
}else{
sa=(max*(down-i-1)-s)+sa;
}
i=down-1;//把i的值改为最大数的下标
}
}
System.out.println("水坑能装的水为:"+sa);
}
}

最后结果第一组数是10,第二组数是17,相符。

0 0
原创粉丝点击