最近在网上看到一道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 classTest

{static int result = 0; //最终结果

static int[] wallHeights = new int[]

{1,6,1,2,3,4,100,1,9}; //表示所有的墙的高度

public static void process(int start, intend)

{//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 voidmain(String[] args)

{

process(0, wallHeights.length - 1);

System.out.println(result);

}

}

代码中的测试用例的结果是22。下面是几组测试用例。

有其他算法的(语言不限)欢迎跟帖

twitter java_Twitter算法面试题详解(Java实现)相关推荐

  1. Java数据结构与算法面试题,首发Java程序员人手必备的进阶知识体系,(1)

    在市场上很少能够看到一套不错的学习笔记,小编也是花了挺久的时间总结了这份**<Java程序员人手必备的进阶知识体系>**,帮助大家系统化高效的进阶学习,而不是零散低效的阅读. 2020全新 ...

  2. java 算法笔试题_【干货】经典算法面试题代码实现-Java版

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面试题3:二维数组中的查找 题目描述:一个二维数组,每一行从左到右递增,每一列从上到下递增.输入一个二维数组和一个整数,判断数组中是否含有整数. publ ...

  3. java算法面试题_【干货】经典算法面试题代码实现-Java版

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面试题3:二维数组中的查找 题目描述:一个二维数组,每一行从左到右递增,每一列从上到下递增.输入一个二维数组和一个整数,判断数组中是否含有整数. publ ...

  4. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  5. 蘑菇街2015校招 Java研发笔试题 详解,2015java

    蘑菇街2015校招 Java研发笔试题 详解,2015java 1. 对进程和线程描述正确的是( ) A.  父进程里的所有线程共享相同的地址空间,父进程的所有子进程共享相同的地址空间. B.  改变 ...

  6. java面笔试_java笔试手写算法面试题大全含答案

    java笔试手写算法面试题大全含答案 1.统计一篇英文文章单词个数. public class WordCounting { public static void main(String[] args ...

  7. Java算法面试题(007) 蒙提霍尔问题(三门问题)

    简介 此问题本身和算法无关,本质上一个关于概率的问题,在一些高等级的面试也经常被问及,因此收录在Java算法面试题系列中. 三门问题(Monty Hall problem)亦称为蒙提霍尔问题.蒙特霍问 ...

  8. java常见算法面试题

    java常见算法面试题 Java的冒泡排序,快速排序,归并排序,计数排序,二分查找法 1.斐波那契数列 1.斐波那契数列又叫黄金分割和兔子数列 :1.1.2.3.5.8.13.21.34.-- 在数学 ...

  9. Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3

    Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3 总览 问题 详解 String.intern()的作用 link LeetCode的Two Sum题 ...

最新文章

  1. 美国AI语音大牛转投小米!因政治正确遭名校JHU开除,其后怒拒FB百万美元合同...
  2. maven项目编译漏掉src/main/java下的xml配置文件
  3. Visual Studio 2013或2015工程属性中包含目录和库目录的添加方法,附加依赖项,相对路径
  4. c语言什么是内联函数,C语言中内联函数inline的使用方法
  5. 判断Python输入是否为数字
  6. PTA-6-3 使用函数的选择法排序 (25分)(C语言)
  7. 【华为云技术分享】用GaussDB合理管控数据资源的几点心得
  8. Python 标准库 - Pprint 模块 - 用于打印 Python 数据结构
  9. Linux 中 的 vi 编辑模式 直接对文件进行修改~
  10. 农业银行网银证书的控件被阻止的解…
  11. ArcGIS多种面积计算方法的区别
  12. c++第二课 输出自定义字符图形
  13. 请在微信客户端打开链接
  14. 钉钉企业微信与飞书模式区别
  15. mysql建立spj_数据库概论——SQL练习一(SPJ零件问题)
  16. 如何使用开源工具「DataEase」制作一个高质量的仪表板
  17. 隐藏控制台程序的dos窗口
  18. 三星服务器内存条型号区分,三星内存条怎么样看型号(揭晓三星内存条查看技巧及报价)...
  19. 仿牛客论坛项目(3)
  20. 视频怎么转换成mp3?视频提取音频超简单的方法

热门文章

  1. c语言 数组循环左移m位
  2. 【记录】利用jar包制作docker镜像
  3. 【uni-app】使用定义在App.vue的方法
  4. vue 项目构建失败 Unhandled rejection Error 的原因 sass解析异常
  5. aide入侵检测工具与crontab
  6. 递归计算二叉树的高度_如何使用递归方法计算二叉树的高度
  7. node.js 程序_如何不使用外部程序包创建Node.js Web应用程序
  8. firebase使用_如何开始使用Firebase Hosting
  9. java高级语言特性_Java语言高级特性——注解
  10. crf模型 java_定制你自己的CRF模型