求解twitter面试题(墙壁装水问题)
来源:互联网 发布:网络免费短信平台 编辑:程序博客网 时间:2024/06/10 18:52
看见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;endvolumebar(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
0 0
- 求解twitter面试题(墙壁装水问题)
- twitter面试题之装水问题
- 对一道Twitter面试题(墙面盛水问题)的解答
- Unity3d人物与墙壁碰撞问题求解
- Twitter面试题(Javascript实现)
- 面试题分享(求解)
- Twitter面试题之墙之间的水坑装雨水问题
- 有趣的积水问题(Twitter编程面试题)
- 一道Twitter编程面试题
- 求解 Fibonacci 面试题
- 神州数码面试题求解
- Twitter算法面试题详解(Java实现)
- Twitter算法面试题详解(Java实现)
- Twitter算法面试题详解(Java实现)
- Twitter算法面试题详解(Java实现)
- 水池问题的lua语言算法(面试题分析:我的Twitter技术面试失败了)
- SQL语句面试题求解——学生分数问题
- 动态规划求解抛鸡蛋问题(Google某年面试题)
- iOS开发之设计模式(四)MVC模式(model-view-controller)
- iOS下做微信分享的开发
- ARM的字对齐问题总结
- 事务未提交读
- C语言组播实现
- 求解twitter面试题(墙壁装水问题)
- Ubuntu 14.10/15.04/ Linux Mint 17.1 中用PPA方式安装Sublime Text 3
- csv文件导出内容有逗号
- sp_executesql介绍和使用
- Go 语言中的 new() 和 make() 的区别
- Rayeager PX2开发板 评测系列之初见
- iOS 开发实战-锁屏界面(密码解锁)
- android之LeftTORight 警报
- 思科CCNA第三学期第二章答案