Twitter算法面试题详解(Java实现)

简介: 最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案。先看一下题目。

最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案。先看一下题目。

图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

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


目录
相关文章
|
人工智能 自然语言处理 DataWorks
DataWorks AI助理实践:一句话,帮你搞定研发周报!
本文介绍如何用一句指令让DataWorks AI助理自动生成研发周报并推送至钉钉文档。涵盖三大核心步骤:构建工作空间知识库以理解业务语义、授权钉钉文档API、创建自定义SKILL固化流程。全程约1–2分钟,大幅提升周报效率。
720 0
配置project.config.json文件报错 解析 project.config.json 文件失败,请检查其内容或删除此文件。
配置project.config.json文件报错 解析 project.config.json 文件失败,请检查其内容或删除此文件。
1100 0
配置project.config.json文件报错 解析 project.config.json 文件失败,请检查其内容或删除此文件。
|
5月前
|
存储 人工智能 自然语言处理
阿里云万小智AI建站完整实操教程:零代码十分钟搭建企业官网全流程
阿里云万小智AI建站是依托大模型驱动的零代码自助建站系统,主打十分钟快速上线企业官网,覆盖域名、备案、可视化设计、一键发布、SEO运营完整链路,面向中小企业、个体商家、初创团队,解决传统建站技术门槛高、周期长、设计成本高、后期运维繁琐的痛点。
746 0
|
6月前
|
弹性计算 数据库 数据安全/隐私保护
SaaS系统技术实践,架构设计及应用场景
本文深入解析SaaS系统的技术实践(多租户隔离、微服务、自动化运维、安全合规)、分层架构设计(基础设施至前端五层)及典型应用场景(CRM、HRM、电商、政务、教育等),兼顾理论深度与落地可行性,助力构建高可用、可扩展、低成本的云原生SaaS系统。(239字)
826 7
|
6月前
|
数据可视化 网络协议 测试技术
VSPING 赋能网站测试,零门槛排查网站问题,新手也能轻松上手
VSPING是一站式智能网站测试工具,覆盖200+国内外节点,支持双端测速、全协议连通性、DNS及域名污染检测。无需技术基础,输入网址一键测试,可视化报告让结果一目了然,助您零门槛规避上线风险,保障访问流畅与口碑。(239字)
435 5
|
5月前
|
监控 算法 机器人
中小IT团队告警治理完整方案:多系统告警统一归集+P1-P3分级+企业微信自动派单实战
Zabbix发企业微信、Syslog往邮箱里塞、UPS的App自己弹窗、云监控又是另一个通知渠道——告警不聚合,IT团队等于一直在4个App之间来回切换。本文从归集→分级→收敛→派单四步给出完整告警治理链路:用Flask搭建统一告警接收服务、P1-P2-P3三级分级规则表、根因收敛算法(一台交换机DOWN不再发37条)、企业微信+钉钉自动派单配置,适合2-5人IT团队的轻量落地。
732 0
|
6月前
|
存储 关系型数据库 分布式数据库
如何破解多租户隔离与性能难题?PolarDB PostgreSQL实战指南
PolarDB PostgreSQL分布式版专为SaaS多租户场景设计,提供垂直(按Schema)与水平(按tenant_id)两种弹性拆分模式,兼顾数据隔离与资源利用率;完全兼容Citus及PostgreSQL生态,支持分布式事务、列存分析、CDC同步、智能连接池等企业级能力。(239字)
如何破解多租户隔离与性能难题?PolarDB PostgreSQL实战指南
|
7月前
|
人工智能 弹性计算 Cloud Native
2026年阿里云代金券/满减券/折扣券介绍说明及领取使用攻略
2026年阿里云升级优惠券体系,推出“AI焕新季”“云工开物”等专项补贴,覆盖个人、企业及高校。本文详解代金券、满减券、折扣券三类区别,梳理官方领取入口,并提供有效期规划、场景选券、叠加技巧等高阶使用攻略,助力大家大幅降低上云成本。
639 2
|
7月前
|
人工智能 算法 安全
孟庆涛:DeepSeek发布V4模型 GEO优化如何重塑品牌的“数字信任”
GEO(生成式引擎优化)是AI时代品牌营销新范式:当DeepSeek V4等大模型化身“首席信任官”,品牌不再靠曝光取胜,而需以官网(原始档案)、媒体(旁证记录)、社区(口碑证词)构建“全栈权威”信任三角,用可验证、可引用、强一致的事实内容,在AI脑中建立坚不可摧的信用档案。(239字)
312 0
|
8月前
|
Web App开发 JavaScript 前端开发
JavaScript 获取浏览器支持的时区
`Intl.supportedValuesOf(&#39;timeZone&#39;)` 是 JavaScript 新增的 API,可获取浏览器支持的所有 IANA 时区列表(如 `&quot;Asia/Shanghai&quot;`),返回字典序排序数组。Chrome 97+、Firefox 93+、Safari 15.4+ 等现代浏览器支持,IE 不支持,Node.js 需 v18+。(239字)