华为OD机试 - 空栈压数 - 栈(Java 2024 E卷 100分)

2024-08-24 15:04

本文主要是介绍华为OD机试 - 空栈压数 - 栈(Java 2024 E卷 100分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设:栈顶至栈底整数依次为n1, n2, …, nx,其中n1为最新压入的整数)

  1. 如果 n1 = n2,则 n1, n2 全部出栈,压入新数据 m (m = 2 * n1)
  2. 如果 n1 = n2 + … + ny 的范围为 3,n,则 n1, n2, …, ny 全部出栈,压入新数据 m (m = 2 * n1)
  3. 如果上述规则均不满足,则不做操作。

如:依次向栈压入 6,1,2,3,

  1. 当压入 2 时,栈顶至栈底依次为 2,1,6;
  2. 当压入 3 时,3 = 2 + 1,3,2,1 全部出栈,重新入栈整数 6,此时栈顶至栈底依次为 6,6;6 = 6,两个 6 全部出栈,压入 12,最终栈中只剩个元素 12。向栈中输入一串数字,请输出应用此规则后栈中最终存留的数字。

二、输入描述

使用单个空格隔开的正整数的字符串 Q,如“5678”,左边的数字先入栈。

  1. 正整数大小为 [1,231 - 1]
  2. 正整数个数为 [1,1000]。

三、输出描述

最终栈中存留的元素值,元素值使用单个空格隔开,从左至右依次为栈顶至栈底的数字。

四、测试用例

测试用例1:

1、输入

10 20 50 80 1 1

2、输出

2 160

测试用例2:

1、输入

5 10 20 50 85 1

2、输出

1 170

五、解题思路

这道题的核心在于使用栈(Stack)来模拟一个逐步压入数字,并根据特定规则进行元素处理的过程。问题要求我们根据输入的数字列表,按照一定的规则对栈进行操作,最后输出栈中的元素。

1、具体步骤如下:

  1. 输入解析:
    • 从输入字符串中读取一组用空格分隔的正整数。按照顺序将这些整数逐个压入栈中。
  2. 栈操作:
    • 每次压入一个新数字后,检查是否满足以下两个规则:
    • 规则1:如果栈顶两个元素相等,则将这两个元素弹出栈,并将它们的两倍值压入栈中。
    • 规则2:如果栈顶元素等于栈中前几个元素之和(范围为3到n),则将这些元素弹出栈,并将栈顶元素的两倍值压入栈中。
    • 在每次应用规则后,需要重新检查栈是否满足规则(因为栈的状态可能发生了变化),直到不能再应用规则为止。
  3. 结果输出:
    • 当所有输入数字都处理完毕,并且不能再应用任何规则时,将栈中的元素按顺序输出。输出的顺序应从栈顶到栈底。

2、算法复杂度分析

(1)时间复杂度:

由于每个元素可能会多次参与规则的匹配,最坏情况下,时间复杂度可以达到 O(n^2),其中 n 是输入数字的个数。这是因为每次元素的压入可能会触发多个规则匹配和弹出操作,尤其是在规则2中需要遍历栈的部分元素进行求和匹配。

(2)空间复杂度:

空间复杂度主要由栈的使用决定,最坏情况下,需要额外的栈空间来保存所有元素,因此空间复杂度为 O(n)。

六、Java算法源码

public class OdTest01 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取输入的数字串,并分割成单个数字的数组String input = sc.nextLine();String[] numbers = input.split(" ");// 使用栈来存放数字Stack<Integer> stack = new Stack<>();// 遍历每个数字并压入栈中for (String num : numbers) {int currentNumber = Integer.parseInt(num); // 将字符串转换为整数stack.push(currentNumber); // 压入栈中// 尝试应用规则1和规则2applyRules(stack); // 对栈应用规则}// 输出最终栈中的内容printStack(stack);}// 对栈应用规则1和规则2private static void applyRules(Stack<Integer> stack) {boolean ruleApplied;// 不断检查直到不能再应用规则do {ruleApplied = false;// 规则1:栈顶两个元素相等if (stack.size() >= 2) {int top1 = stack.pop();int top2 = stack.pop();if (top1 == top2) {int newElement = 2 * top1;stack.push(newElement);ruleApplied = true;} else {stack.push(top2); // 恢复栈的状态stack.push(top1);}}// 规则2:栈顶元素等于前若干元素之和if (!ruleApplied && stack.size() >= 3) {int top1 = stack.pop();int sum = 0;Stack<Integer> tempStack = new Stack<>(); // 临时栈用来保存弹出的元素// 计算前面的若干元素之和while (!stack.isEmpty()) {int element = stack.pop();tempStack.push(element); // 保存到临时栈sum += element;if (sum == top1) {int newElement = 2 * top1;stack.push(newElement); // 压入新元素ruleApplied = true;break;}}// 如果没有应用规则2,则恢复栈的状态if (!ruleApplied) {while (!tempStack.isEmpty()) {stack.push(tempStack.pop());}stack.push(top1);}}} while (ruleApplied); // 如果应用了规则,继续检查}// 按照要求输出栈中的元素private static void printStack(Stack<Integer> stack) {// 按栈顶到栈底的顺序输出while (!stack.isEmpty()) {System.out.print(stack.pop());if (!stack.isEmpty()) {System.out.print(" ");}}}
}

七、效果展示

1、输入

10 20 50 80 1 1

2、输出

2 160

3、说明

  1. 压入10:
    • 栈:[10]
    • 没有规则满足,继续。
  2. 压入20:
    • 栈:[10, 20]
    • 没有规则满足,继续。
  3. 压入50:
    • 栈:[10, 20, 50]
    • 没有规则满足,继续。
  4. 压入80:
    • 栈:[10, 20, 50, 80]
    • 没有规则满足,继续。
  5. 压入1:
    • 栈:[10, 20, 50, 80, 1]
    • 没有规则满足,继续。
  6. 再次压入1:
    • 栈:[10, 20, 50, 80, 1, 1]
  7. 触发规则1:栈顶的两个元素相等(两个1),将它们弹出并将它们的两倍值(2)压入栈中。
    • 栈变化为:[10, 20, 50, 80, 2]
  8. 触发规则2:
    • 现在栈顶元素是2,但没有符合规则2的条件(即没有与2相等的前若干元素的和)。
    • 栈保持为:[10, 20, 50, 80, 2]
    • 接下来处理栈中的元素以检查是否有符合规则的。
  9. 再次触发规则2:
    • 栈顶元素是2,无需处理,但栈中有:80、50、20和10,其中,80 = 50 + 20 + 10,满足规则2的条件。
    • 弹出80、50、20、10,然后将160(2*80)压入栈中。
    • 栈最终变为:[160, 2]
  10. 最终栈状态:
    • 经过以上步骤操作,栈中元素从栈顶到栈底依次为:2 和 160。

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 D卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

这篇关于华为OD机试 - 空栈压数 - 栈(Java 2024 E卷 100分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听