twitter java_Twitter算法面试题详解(Java实现)
最近在网上看到一道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实现)相关推荐
- Java数据结构与算法面试题,首发Java程序员人手必备的进阶知识体系,(1)
在市场上很少能够看到一套不错的学习笔记,小编也是花了挺久的时间总结了这份**<Java程序员人手必备的进阶知识体系>**,帮助大家系统化高效的进阶学习,而不是零散低效的阅读. 2020全新 ...
- java 算法笔试题_【干货】经典算法面试题代码实现-Java版
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面试题3:二维数组中的查找 题目描述:一个二维数组,每一行从左到右递增,每一列从上到下递增.输入一个二维数组和一个整数,判断数组中是否含有整数. publ ...
- java算法面试题_【干货】经典算法面试题代码实现-Java版
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面试题3:二维数组中的查找 题目描述:一个二维数组,每一行从左到右递增,每一列从上到下递增.输入一个二维数组和一个整数,判断数组中是否含有整数. publ ...
- 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记
一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...
- 蘑菇街2015校招 Java研发笔试题 详解,2015java
蘑菇街2015校招 Java研发笔试题 详解,2015java 1. 对进程和线程描述正确的是( ) A. 父进程里的所有线程共享相同的地址空间,父进程的所有子进程共享相同的地址空间. B. 改变 ...
- java面笔试_java笔试手写算法面试题大全含答案
java笔试手写算法面试题大全含答案 1.统计一篇英文文章单词个数. public class WordCounting { public static void main(String[] args ...
- Java算法面试题(007) 蒙提霍尔问题(三门问题)
简介 此问题本身和算法无关,本质上一个关于概率的问题,在一些高等级的面试也经常被问及,因此收录在Java算法面试题系列中. 三门问题(Monty Hall problem)亦称为蒙提霍尔问题.蒙特霍问 ...
- java常见算法面试题
java常见算法面试题 Java的冒泡排序,快速排序,归并排序,计数排序,二分查找法 1.斐波那契数列 1.斐波那契数列又叫黄金分割和兔子数列 :1.1.2.3.5.8.13.21.34.-- 在数学 ...
- Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3
Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3 总览 问题 详解 String.intern()的作用 link LeetCode的Two Sum题 ...
最新文章
- 美国AI语音大牛转投小米!因政治正确遭名校JHU开除,其后怒拒FB百万美元合同...
- maven项目编译漏掉src/main/java下的xml配置文件
- Visual Studio 2013或2015工程属性中包含目录和库目录的添加方法,附加依赖项,相对路径
- c语言什么是内联函数,C语言中内联函数inline的使用方法
- 判断Python输入是否为数字
- PTA-6-3 使用函数的选择法排序 (25分)(C语言)
- 【华为云技术分享】用GaussDB合理管控数据资源的几点心得
- Python 标准库 - Pprint 模块 - 用于打印 Python 数据结构
- Linux 中 的 vi 编辑模式 直接对文件进行修改~
- 农业银行网银证书的控件被阻止的解…
- ArcGIS多种面积计算方法的区别
- c++第二课 输出自定义字符图形
- 请在微信客户端打开链接
- 钉钉企业微信与飞书模式区别
- mysql建立spj_数据库概论——SQL练习一(SPJ零件问题)
- 如何使用开源工具「DataEase」制作一个高质量的仪表板
- 隐藏控制台程序的dos窗口
- 三星服务器内存条型号区分,三星内存条怎么样看型号(揭晓三星内存条查看技巧及报价)...
- 仿牛客论坛项目(3)
- 视频怎么转换成mp3?视频提取音频超简单的方法
热门文章
- c语言 数组循环左移m位
- 【记录】利用jar包制作docker镜像
- 【uni-app】使用定义在App.vue的方法
- vue 项目构建失败 Unhandled rejection Error 的原因 sass解析异常
- aide入侵检测工具与crontab
- 递归计算二叉树的高度_如何使用递归方法计算二叉树的高度
- node.js 程序_如何不使用外部程序包创建Node.js Web应用程序
- firebase使用_如何开始使用Firebase Hosting
- java高级语言特性_Java语言高级特性——注解
- crf模型 java_定制你自己的CRF模型