【转】Twitter算法面试题详解(Java实现)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://androidguy.blog.51cto.com/974126/1319659 |
最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案。先看一下题目。
图1
先看看图图1。可以将方块看做砖。题干很简单,问最多能放多少水。例如,图2就是图1可放的最多水(蓝色部分),如果将一块砖看做1的话,图2就是能放10个单位的水。
图2
再看个例子
图3
图3可以放17个单位的水。
上面每一个图的砖墙用int数组表示,每一个数组元素表示每一列砖墙的砖数(高度),例如,图3用数组表示就是int[] wallHeights = new int[]{2, 5, 1, 3, 1, 2, 1, 7, 7, 6
};
这里某人给出了python的算法,不过有人说有问题,有python环境的可以验证。现在给出我的Java算法。
算法原理
其实很简单,我的算法并不是累加的,而是用的减法,先用图3为例。只需要找到所有墙中最高的,然后再找出第二高的。如果两堵墙紧邻者,就忽略它,否则算一下 如果墙之间没有任何其他的砖的情况下可以有多少水(只是一个乘法而已),然后扫描两堵墙之间有多少块砖,减去这个砖数就可以了。最后用递归处理。将两堵墙 两侧到各自的左右边界再重新进行前面的操作(递归处理)。直到无墙可处理。 用递归方法很容易理解。下面看一下算法的详细代码。
public class Twitter {
static int result = 0; // 最终结果
static int[] wallHeights = new int[] { 1, 6, 1, 2, 3, 4, 100, 1, 9 }; // 表示所有的墙的高度 public static void process(int start, int end) {
// first:start和end之间最高的墙
// second:start和end之间第二高的墙
int first = 0, second = 0;
// firstIndex:第一高的墙在wallHeights中的索引
// secondIndex:第二高的墙在wallHeights中的索引
int firstIndex = 0, secondIndex = 0;
// 两堵墙必须至少有一堵墙的距离
if (end - start <= 1)
return;
// 开始获取第一高和第二高墙的砖数
for (int i = start; i <= end; i++) {
if (wallHeights[i] > first) {
second = first;
secondIndex = firstIndex;
first = wallHeights[i];
firstIndex = i;
} else if (wallHeights[i] > second) {
second = wallHeights[i];
secondIndex = i;
}
}
// 获取左侧墙的索引
int startIndex = Math.min(firstIndex, secondIndex);
// 获取右侧墙的索引
int endIndex = Math.max(firstIndex, secondIndex);
// 计算距离
int distance = endIndex - startIndex;
// 如果第一高的墙和第二高的墙之间至少有一堵墙,那么开始计算这两堵墙之间可以放多少个单位的水
if (distance > 1) {
result = result + (distance - 1) * second;
// 减去这两堵墙之间的砖数
for (int i = startIndex + 1; i < endIndex; i++) {
result -= wallHeights[i];
}
}
// 开始递归处理左侧墙距离开始位置能放多少水
process(start, startIndex);
// 开始递归处理右侧墙距离结束位置能放多少水
process(endIndex, end);
} public static void main(String[] args) {
process(0, wallHeights.length - 1);
System.out.println(result);
}
}
代码中的测试用例的结果是22。
下面是几组测试用例。
[
2
,
5
,
1
,
2
,
3
,
4
,
7
,
7
,
6
] 结果:10
[
2
,
5
,
1
,
3
,
1
,
2
,
1
,
7
,
7
,
6
] 结果:17
[
6
,
1
,
4
,
6
,
7
,
5
,
1
,
6
,
4] 结果:13
[
9,6,1,2,3,4,50,1,9] 结果:37
有其他算法的(语言不限)欢迎跟帖......
【转】Twitter算法面试题详解(Java实现)的更多相关文章
- Twitter算法面试题详解(Java实现)
最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...
- 算法实践——Twitter算法面试题(积水问题)的线性时间解法
问题描述:在下图里我们有不同高度的挡板.这个图片由一个整数数组所代表,数组中每个数是墙的高度.下图可以表示为数组(2.5.1.2.3.4.7.2).假如开始下雨了,那么挡板之间的水坑能够装多少水(水足 ...
- Java算法面试题(史上最强、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- 《Java面试全解析》505道面试题详解
<Java面试全解析>是我在 GitChat 发布的一门电子书,全书总共有 15 万字和 505 道 Java 面试题解析,目前来说应该是最实用和最全的 Java 面试题解析了. 我本人是 ...
- 算法面试题:一个List<Student>,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点!
算法面试题:一个List,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点! 解题思路 这是群里某位小伙伴去面试碰到的面试题,从题目本身来看,面试官应该是要考察面试者对泛型 Lis ...
- 常见的js算法面试题收集,es6实现
1.js 统计一个字符串出现频率最高的字母/数字 let str = 'asdfghjklaqwertyuiopiaia'; const strChar = str => { let strin ...
- 不止面试02-JVM内存模型面试题详解
第一部分:面试题 本篇文章我们将尝试回答以下问题: 描述一下jvm的内存结构 描述一下jvm的内存模型 谈一下你对常量池的理解 什么情况下会发生栈内存溢出?和内存溢出有什么不同? String str ...
- 详解Java GC的工作原理+Minor GC、FullGC
详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...
- Protocol Buffer技术详解(Java实例)
Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...
随机推荐
- 【DCN】端口与地址绑定技术
端口与地址绑定技术 与AM技术不同之处在于,AM端口下绑定的MAC或IP能够通信,不限制绑定的MAC在其它接口下通信. 开启MAC-CPU学习模式 mac-address-learning c ...
- 从规则引擎到复杂事件处理(CEP)
Drools Fusion既是规则引擎,又可以作为CEP.除了事件定义和时间推理之外,对于引擎本身也会有一些不同的使用.主要体现在会话时钟.流模式.滑动窗口和对事件的内存管理. 会话时钟 由于事件的时 ...
- C++调用Lua编程环境搭建及测试代码示例
C++调用Lua编程环境搭建及测试代码示例 摘要:测试环境是VS2005+LuaForWindows_v5.1.4-45.exe+WIN7 1.安装lua开发环境LuaForWindows_v5.1. ...
- H3C RIPv2配置举例
- Python--day38--进程同步控制的---锁\信号量\事件的方法名
- Linux 旗标实现
Linux 内核提供了一个遵守上面语义的旗标实现, 尽管术语有些不同. 为使用旗标, 内核 代码必须包含 <asm/semaphore.h>. 相关的类型是 struct semaphor ...
- 组合数学入门—TwelveFold Way
组合数学入门-TwelveFold Way 你需要解决\(12\)个组合计数问题. \(n\)个有标号/无标号的球分给\(m\)个有标号/无标号的盒子 盒子有三种限制: A.无限制 B.每个盒子至少有 ...
- vue-learning:15 - js - data
data data属性是一个对象,存放最纯粹的数据,这些数据可以在模板template.计算属性computed.方法methods.监听器watch.过滤器filters.生命周期函数中使用,并且可 ...
- koa2--05.koa-bodyparser中间件的使用,处理post数据
首先在项目文件夹下使用cmd,输入: npm install --save koa-bodyparser //koa koa-bodyparser中间件的使用 --post提交数据 const koa ...
- C#调用smtp邮件发送几个大坑
1.网易.新浪邮箱新增了一个叫“授权码”的东西,开通smtp服务时,必须开启授权码,并且邮件发送代码中也需要加上授权码,如下代码: //指定邮箱账号和密码,需要注意的是,这个密码是你在邮箱设置里开启服 ...