您的位置:首页 > 职场人生

求解twitter面试题(墙壁装水问题)

2015-02-04 15:07 295 查看
看见twitter上一道面试题,题目是这样的,试着做了一下





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

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

思路分析:

1. 找出该数组最大的元素(row);

2. 将该数组以该最大值为边界分为左右两侧分别计算;

3. 计算左侧

3.1 找出左侧最大的值(left_row)

3.2 计算left_row和row之间(left_row的右侧到row)的蓄水量,由于该范围两个端点的值最大,所以无论中间什么情况,水的上界和两个端点较小值是相同的;

3.3 以left_row为新的右侧边界,重复3.1,直到左侧到达数组的最左边的值

4. 右侧方法和左侧类似

代码验证(matlab)

生成的随机数组柱状图如下

代码:

clc;clear;
%生成随机数组
n=5;
x=magic(n);
x=reshape(x,1,n*n);
x=[0,x,0]; %边值为0
[x1,row]=max(x);
rx=x(row:n*n+2);
volume=0;
%最大值左侧遍历
i=row;
while i>3
lx=x(1:i-1);
[x_left, row_left]=max(lx);
calculableV=x(row_left:i);
volume=calculateV(calculableV)+volume;
i=row_left;
end
%最大值右侧遍历
i=row;
while i<n*n
rx=x(i+1:n*n+2);
[x_right, row_right]=max(rx);
row_right=row_right+i;
calculableV=x(i:row_right);
volume=calculateV(calculableV)+volume;
i=row_right;
end
volume
bar(x);


function [volume] = calculateV(x)
%CALCULATEV Summary of this function goes here
%   Detailed explanation goes here
v=0;
[a b]=size(x);
if x(1) >= x(b)
want=b;
else
want=1;
end
for i=2:b-1
v=v+x(i);
end
volume=x(want)*(b-2)-v;
end


验证结果:

volume=219
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: