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

2023-11-29 02:36

本文主要是介绍【华为OD题库-043】二维伞的雨滴效应-java,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

普通的伞在二维平面世界中,左右两侧均有一条边,而两侧伞边最下面各有一个伞坠子,雨滴落到伞面,逐步流到伞坠处,会将伞坠的信息携带并落到地面,随着日积月累,地面会呈现伞坠的信息。
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),查看当前专栏更新的所有题目。

这篇关于【华为OD题库-043】二维伞的雨滴效应-java的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/431138

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<