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 class Test  
{  
    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


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

 本文转自银河使者博客园博客,原文链接http://www.cnblogs.com/nokiaguy/p/3405149.html如需转载请自行联系原作者

银河使者
相关文章
|
2天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
8天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
4天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
21 4
|
5天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
33 4
|
25天前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
29天前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
79 1
Java面试题之Java集合面试题 50道(带答案)
|
1月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
30 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
17天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
40 5
|
16天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
17 1
|
20天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
下一篇
无影云桌面