【华为OD题库-043】二维伞的雨滴效应-java

news2024/9/22 7:27:28

题目

普通的伞在二维平面世界中,左右两侧均有一条边,而两侧伞边最下面各有一个伞坠子,雨滴落到伞面,逐步流到伞坠处,会将伞坠的信息携带并落到地面,随着日积月累,地面会呈现伞坠的信息。
1、为了模拟伞状雨滴效应,用二叉树来模拟二维平面伞(如下图所示),现在输入一串正整数数组序列(不含0,数组成员至少是1个),若此数组序列是二叉搜索树的前序遍历的结果,那么请输出一个返回值1,否则输出0.
2、同时请将此序列构成的伞状效应携带到地面的数字信息输出来(左边伞坠信息,右边伞坠信息,详细参考示例图地面上数字),若此树不存在左或右扇坠,则对应位置返回0。同时若非二叉排序树那么左右伞坠信息也返回0.
在这里插入图片描述
输入描述:
1个通过空格分割的整数序列字符串,数组不含0,数组成员至少1个,输入的数组的任意两个数字都互不相同,最多1000个正整数,正整数值范围1~65535
输出描述:
输出如下三个值,以空格分隔:是否二叉排序树,左侧地面呈现的伞坠数字值,右侧地面呈现的伞坠数字值.若是二叉排序树,则输出1,否则输出0(其左右伞坠值也直接赋值0)。
若不存存在左侧或者右侧伞坠值,那么对应伞坠值直接赋值0。
示例1
输入:
8 3 1 6 4 7 10 14 13
输出:
1 1 13
说明:
1 表示是二叉搜索树前序遍历结果,1表示左侧地面呈现的伞坠数字值,13表示右侧地面呈现的伞坠数字值

思路

本题化解为两个问题

  1. 根据前序遍历数组(中>左>右),判断其是否能构成二叉搜索树(左节点<中间节点<右节点)

以示例数据为例:8 3 1 6 4 7 10 14 13
根据前序遍历及二叉搜索树的特点,第一个数8应该为根节点,其后面小于8的所有数(3 1 6 4 7)在8的左边,大于8的所有数(10 14 13 )在8的右边。问题化解为两个字数组是否为二叉搜索树,用同样的办法递归判断即可。

  1. 设计dfs方法为:dfs(nums,start,end),当前节点为nums[start],设i=start+1,不断右移i,先找到第一个比当前节点大的数在索引,【start+1,i-1】就是左节点的部分;
  2. 继续右移i,直到i越界或者nums[i]小于当前值。
  3. 如果最后i是越界的(i=end+1),说明后面的数都比nums[start]大,满足二叉搜索树的规律,继续递归两个子数组;【start+1,i-1】和【i,end】;递归中止条件是start==end,即只有一个数字,返回true
  4. 否则,不满足,直接返回false
  1. 求左右伞坠,关键在于理解左右伞坠的定义,题目并没有明确说明,我的理解如下:
  1. 如果不是二叉搜索树,左右伞坠直接置0
  2. 如果根节点没有左子树,那么左伞坠为0,如果没有右子树,那么右伞坠为0
  3. 寻找左伞坠的方法,优先寻找左子树,当左节点为空时,再找右节点
  4. 寻找右伞坠的方法,优先寻找右子树,当右节点为空时,再找左节点

比如示例数据:8 3 1 6 4 7 10 14 13,输出1 1 13
删除一个节点:8 3 6 4 7 10 14 13,输出1 4 13
只要左子树:8 3 1 6 4 7,输出:1 1 0
只要右子树:8 10 14 13,输出:1 0 13
只要根节点:8,输出:1 0 0

题解

package hwod;

import java.util.Arrays;
import java.util.Scanner;

public class UmbrellaRainDrop {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int[] res = umbrellaRainDrop(nums);
        for (int i = 0; i < res.length; i++) {
            if (i != 0) System.out.print(" ");
            System.out.print(res[i]);
        }
        System.out.println();
    }

    private static int[] umbrellaRainDrop(int[] nums) {
        boolean isSearchTree = recur(nums, 0, nums.length - 1);
        if (!isSearchTree) return new int[]{0, 0, 0};
        int leftNum = findLastNum(nums, 0, nums.length - 1, true);
        int rightNum = findLastNum(nums, 0, nums.length - 1, false);
        return new int[]{1, leftNum, rightNum};
    }

    private static int findLastNum(int[] nums, int start, int end, boolean isLeft) {
        if (start == end) return start == 0 ? 0 : nums[start];
        int i = start + 1;
        while (i <= end && nums[i] < nums[start]) i++;
        //处理没有左右伞坠的情况
        if (isLeft && i == start + 1 && start == 0) return 0;
        if (!isLeft && i == end + 1 && start == 0) return 0;
        if (isLeft) {
            //先找左边,如果没有左节点,就找右节点
            return i == start + 1 ? findLastNum(nums, i, end, isLeft) : findLastNum(nums, start + 1, i - 1, isLeft);
        } else {
            //先找右边,如果没有右节点,就找左节点
            return i == end + 1 ? findLastNum(nums, start + 1, i - 1, isLeft) : findLastNum(nums, i, end, isLeft);
        }


    }


    private static boolean recur(int[] nums, int start, int end) {
        if (start > end) {
            return true;
        }
        int i = start + 1;
        while (i <= end && nums[i] < nums[start]) i++;
        int tmp = i;
        while (i <= end && nums[i] > nums[start]) i++;
        if (i != end + 1) return false;
        return recur(nums, start + 1, tmp - 1) && recur(nums, tmp, end);
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1264526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FlowJo 10 v10.4(流式细胞分析软件)

FlowJo是一款广泛应用的流式细胞数据分析软件&#xff0c;它功能强大&#xff0c;简单易用&#xff0c;是流式领域最受推荐的一款专业分析软件&#xff0c;也是各高影响力科学期刊使用最多的软件&#xff0c;已经成了行业的一个标准。 FlowJo具有全面专业的分析功能&#xff0…

解析直播第三方美颜SDK:技术原理与应用

时下&#xff0c;直播平台和主播们纷纷引入美颜技术&#xff0c;以提升视觉效果和用户体验。而在众多美颜技术中&#xff0c;直播第三方美颜SDK成为许多开发者和平台的首选&#xff0c;因其灵活性和高效性而备受推崇。 一、技术原理&#xff1a;美颜算法的精髓 第三方美颜SDK…

Keil5 debug

目录 debug调试功能 基本功能&#xff1a; 程序复位&#xff1a;Reset 运行&#xff1a;Run 停止&#xff1a;Stop 断点调试&#xff08;Breakpoint Debugging&#xff09; 单步调试&#xff1a; 单步调试:Step 单步跳过调试&#xff1a;Step Over&#xff1a; 单步返…

不同路径 II(力扣LeetCode)动态规划

不同路径 II 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。…

Centos7安装配置nginx

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解&#xff08;如有不正确的地方欢迎各位小伙伴在评论区提意见&#xff0c;小编会及时修改&#xff09; Centos7安装配置nginx Nginx介绍 Nginx (engine x) 是一个高性能的 HTTP 和 反向代理 服务&#xff0c;也…

运营商网络性能测试-Y.1564

前言 在网络部署之后和业务开展之前&#xff0c;运营商迫切希望了解当前网络的性能状态&#xff0c;以便为商业规划和业务推广提供必要的基础数据支持。因此&#xff0c;高可靠性和高精确度的性能测试方法对于运营商评判网络性能的优劣&#xff0c;显得尤为重要&#xff0c;而…

InnoSetupCompiler打包程序

修改默认的安装路径 因为程序可能需要在安装路径中写日志&#xff0c;默认的安装路径C:\Program Files (x86)&#xff0c;这个路径好像是受保护还是啥&#xff0c;如果使用默认的打开会报错。 修改方法&#xff1a; DefaultDirName{autopf}\{#MyAppName} {autopf}改成…

【安卓】安卓xTS之Media模块 学习笔记(1) xTS介绍

1.背景 Media的安卓xTS相关测试和功能修复已经进行了一段时间了。 在此整理总结下xTS工作总结&#xff0c;留待后续查阅整理。 2. xTS介绍 - 什么是xTS 谷歌的xTS是对谷歌发布的CTS/GTS/VTS/STS/BTS/CTS-on-GSI等一系列测试的统称。 因为安卓系统比较庞大&#xff0c;模块多…

.mat格式文件是什么?及将png,jpg,bmp,gif,tiff,psd等格式图片转为.mat格式(附代码)

很多深度学习网络的输入要求为.mat格式&#xff0c;当然也可以直接修改输入数据的代码&#xff0c;比如修改为使用OpenCV读取图片等&#xff0c;但有些网络修改起来比较麻烦&#xff0c;且.mat数据有很多优势&#xff0c;所以部分网络最好还是用默认的.mat格式数据 目录 一、.…

jekins CVE-2018-1000861 漏洞复现

jekins CVE-2018-1000861 漏洞复现 ‍ 名称: jenkins 命令执行 &#xff08;CVE-2018-1000861&#xff09; 描述: ​Jenkins 可以通过其网页界面轻松设置和配置,其中包括即时错误检查和内置帮助。 插件 通过更新中心中的 1000 多个插件,Jenkins 集成了持续集成和持续交付工具…

PTA-6-48 使用面向对象的思想编写程序描述动物

题目&#xff1a; 使用面向对象的思想编写程序描述动物&#xff0c;说明&#xff1a; &#xff08;1) 分析兔子和青蛙的共性&#xff0c;定义抽象的动物类&#xff0c;拥有一些动物共有的属性&#xff1a;名字、颜色、类别&#xff08;哺乳类、非哺乳类&#xff09;&#xff0c…

三十、elasticsearch集群

目录 一、集群的概念 1、节点 2、索引 3、分片和副本 二、集群的架构 三、集群的部署方式 1、单主节点 2、多主节点 3、安全集群 四、搭建ES集群 1、elasticsearch中集群节点有不同的职责划分 2、elasticsearch中的每个节点角色都有自己不同的职责&#xff0c;因此…

中间件安全:JBoss 反序列化命令执行漏洞.(CVE-2017-12149)

中间件安全&#xff1a;JBoss 反序列化命令执行漏洞.&#xff08;CVE-2017-12149&#xff09; JBoss 反序列化漏洞&#xff0c;该漏洞位于 JBoss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter 过滤器中&#xff0c;其 doFilter 方法在没有进行任何安全检查和限制的情况下尝试…

基于ssm的编程技术类博客系统的设计与实现

基于SSM的编程技术类博客系统的设计与实现 摘要&#xff1a;博客是是互联网信息产生的主要来源之一。博客将信息采集与发布最大程度的简单化与快捷化&#xff0c;对个人能力提升也具有极大的帮助。一方面&#xff0c;极大地丰富了网络信息的资源&#xff0c;在时效性、连续流动…

美团2023年Q3财报:营收765亿元 即时零售订单量增至62亿笔

11月28日&#xff0c;美团(股票代码:3690.HK)发布2023年第三季度业绩&#xff0c;公司当季收入765亿元(人民币&#xff0c;下同)&#xff0c;较去年同比增长22.1%。基于提质增效的经营策略&#xff0c;主体业务表现稳固健康&#xff0c;带动公司整体经调整净利润为57.3亿元。 …

Mysql更新Blob存储的Josn数据

Mysql更新blob存储的Josn数据 记录一次mysql操作blob格式存储的json字符串数据 1、检查版本 -- 版本5.7以上才可以能执行json操作 select version(); 2、创建测试数据 -- 创建测试表及测试数据 CREATE TABLE test_json_table AS SELECT UUID(), {"test1": {"…

1-2-3图片的排列

目录 1.展示效果 2.基础方法源码展示 ①div部分展示 ②css部分展示 3.接口方法源码展示 scoped使用 1.展示效果 2.基础方法源码展示 ①div部分展示 <view class"container"> <view class"cover"> <im…

【Java lambda表达式详解】

在Java编程中&#xff0c;我们经常会遇到需要实现一个接口或者继承一个类的情况。然而&#xff0c;有时候我们并不需要一个完整的类来实现这个接口&#xff0c;而是只需要一个简单的功能。这时候&#xff0c;我们就可以使用Java 8引入的Lambda表达式。本文将介绍Lambda表达式的…

Java中的Integer.bitCount浅析

文章目录 Java中的Integer.bitCount浅析问题思考Integer.bitCount解释拓展 Java中的Integer.bitCount浅析 原文链接 问题 有一个整数x,我们需要统计该整数的二进制表示中包含的1的个数。这个也被称为汉明重量&#xff08;Hamming weight&#xff09;。 例如&#xff0c;整数…