空栈压数 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集

华为od机试

题目描述

向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设:栈顶至栈底整数依次编号为 $n_1, n_2, \dots, n_x $,其中 n 1 n_1 n1 为最新压入的整数):

  1. 如果 $ n_1 = n_2 $,则 $n_1, n_2 $全部出栈,压入新数 $ m = 2 \times n_1$。
  2. 如果 $ n_1 = n_2 + \dots + n_y $(y 的范围为 [3, x]),即 $ n_1, n_2, \dots, n_y $ 全部出栈,压入新数$ m = 2 \times n_1 $。
  3. 如果上述规则都不满足,则不做操作。

向栈中输入一串数字,请输出应用此规则后栈中最终存留的数字。

输入描述

一行字符串,包含使用单个空格隔开的正整数,如“5 6 7 8”,左边的数字先入栈。

  1. 正整数大小为 [1, 2^31-1]
  2. 正整数个数为[1, 1000]

输出描述

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

示例1

输入:
10 20 50 80 1 1

输出:
2 160

示例2

输入:
5 10 20 50 85 1

输出:
1 170

题解

这道题目是关于栈的操作,属于栈模拟类型的算法题。核心是通过栈的特性完成特定规则的数字压入和出栈操作。题目的规则有两个主要分支:

  1. 如果栈顶的两个数字相等,则弹出这两个数字,代之以它们的两倍压入栈。
  2. 如果栈顶的某些数字之和等于新加入的数字,则将这些数字弹出,压入它们两倍的新数字。

我们可以借助栈的后进先出(LIFO)特点,逐步模拟这些规则。

解题思路

  1. 栈模拟:首先初始化一个空栈,从输入的数字序列逐个压入栈中。
  2. 处理相等的数字:在每次压入新数字时,检查栈顶两个数字是否相等,如果相等,则将它们合并成新的数字。
  3. 处理和等于新数字的情况:如果栈中一部分数字之和等于当前压入的数字,则将这部分数字合并为新的数字压入栈。
  4. 输出结果:最终栈中剩余的数字逆序输出即可。

Java

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

/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] arr = Arrays.stream(scanner.nextLine().split(" "))
                .mapToInt(Integer::parseInt).toArray();

        MyStack stack = new MyStack(1010);
        for (int num : arr) stack.push(num);
        stack.print();
    }
}


class MyStack {
    private int[] data;
    private int len;

    public MyStack(int capatity) {
        this.data = new int[capatity];
        this.len = 0;
    }

    public void push(int num) {
        // 如果 n1 == n2 ,压入 m = 2 * n1
        if (this.len < 0 && this.data[this.len - 1] == num) {
            this.data[this.len - 1] = num * 2;
            return;
        }

        // 满足 n1 == n2 + ... + ny
        long sum = 0L;
        for (int idx = this.len - 1; sum < num && idx >= 0; idx--) {
            sum += this.data[idx];
            if (sum == num) {
                this.data[idx] = num * 2;
                this.len = idx + 1;
                return;
            }
        }

        // 不满足上述合并
        this.data[len++] = num;
    }

    public void print() {
        StringBuilder sb = new StringBuilder();
        for (int i = len - 1; i >= 0; i--) {
            sb.append(data[i]).append(' ');
        }
        System.out.println(sb.toString());
    }
}

Python

def push(stack, num):
    # 如果 n1 == n2 ,压入 m = 2 * n1
    if stack and stack[-1] == num:
        stack[-1] = num * 2
        return

    # 满足 n1 == n2 + ... + ny
    total_sum = 0
    for idx in range(len(stack) - 1, -1, -1):
        total_sum += stack[idx]
        if total_sum == num:
            stack[idx] = num * 2
            stack = stack[:idx + 1]
            return

    # 不满足上述合并
    stack.append(num)


def main():
    stack = []

    # 读入数据
    input_data = input().strip().split()
    for num in input_data:
        push(stack, int(num))

    # 逆序输出
    print(" ".join(map(str, reversed(stack))))


if __name__ == "__main__":
    main()

C++

#include <iostream>
#include <vector>

using namespace std;;

void push(vector<int> &stack, int num) {
    // 如果 n1 == n2 ,压入 m = 2 * n1
    if (!stack.empty() && stack.back() == num) {
        stack[stack.size() - 1] = num * 2;
        return;
    }

    // 满足 n1 == n2 + ... + ny
    long long sum = 0LL;
    for (int idx = stack.size() - 1; sum < num && idx >= 0; idx--) {
        sum += stack[idx];
        if (sum == num) {
            stack[idx] = num * 2;
            stack.resize(idx + 1);
            return;
        }
    }

    // 不满足上述合并
    stack.push_back(num);
}


int main() {
    vector<int> stack;

    // 读入数据
    int num;
    while (cin >> num) push(stack, num);

    for (auto it = stack.rbegin(); it != stack.rend(); it++) {
        cout << *it << " ";
    }

    return 0;
}

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SPI驱动学习六(SPI_Master驱动程序)

目录 前言一、SPI_Master驱动程序框架1. SPI传输概述1.1 数据组织方式1.2 SPI控制器数据结构 2. SPI传输函数的两种方法2.1 老方法2.2 新方法 二、如何编写SPI_Master驱动程序1. 编写设备树2. 编写驱动程序 三、SPI_Master驱动程序简单示例demo1. 使用老方法编写的SPI Master驱…

NLP 主流应用方向

主流应用 文本分类文本匹配序列标注生成式任务 应用细分 常见落地应用举例&#xff1a; 文本纠错句法分析文本翻译话者分离 本质为文本分类任务数字归一化 实现数字映射&#xff0c;提高内容可读性 如将一九九九转1999

【高分系列卫星简介——高分三号卫星(GF-3)】

高分三号卫星&#xff08;GF-3&#xff09; 高分三号&#xff08;GF-3&#xff09;是我国首颗高分辨率、C频段、多极化合成孔径雷达&#xff08;SAR&#xff09;卫星&#xff0c;由中国空间技术研究院北京空间飞行器总部设计部研制&#xff0c;并于2016年8月10日成功发射。该卫…

flash_attention简要笔记

优化效果 原来&#xff0c;attention部分的计算量和中间激活占用显存的复杂度都是 O ( N 2 ) O(N^2) O(N2) 计算量部分原来QK矩阵乘和attn_scoreV矩阵乘的计算量&#xff0c;复杂度都是 O ( N 2 ) O(N^2) O(N2)&#xff1b;中间激活因为中间有一个attn_score&#xff0c;所以复…

10.解析解方法推导线性回归——不容小觑的线性回归算法

引言 线性回归是许多复杂机器学习模型的基础。作为一种基本的机器学习方法&#xff0c;线性回归提供了清晰的思路和工具&#xff0c;通过理解其推导过程&#xff0c;可以更好地掌握机器学习的基本原理和模型设计。 通过阅读本篇博客&#xff0c;你可以&#xff1a; 1.学会如…

win11永久关闭Windows Defend

# Win11 Microsoft Defender 防病毒 彻底关闭 Win11 Microsoft Defender 防病毒关闭 **WinR****——输入 gpedit.msc &#xff0c;打开本地组策略编辑器——计算机配置——管理模板——Windows组件——Microsoft Defender 防病毒——关闭 Microsoft Defender 防病毒策略——设置…

免费在线压缩pdf 压缩pdf在线免费 推荐简单好用

压缩pdf在线免费&#xff1f;在日常生活和工作学习中&#xff0c;处理PDF文件是常见任务。但有时PDF文件体积较大&#xff0c;给传输、存储和分享带来不便。因此&#xff0c;学习PDF文件压缩技巧十分必要。压缩PDF文件是指通过技术手段减小文件占用的存储空间&#xff0c;同时尽…

kafka 一步步探究消费者组与分区分配策略

本期主要聊聊kafka消费者组与分区 消费者组 & 消费者 每个消费者都需要归属每个消费者组&#xff0c;每个分区只能被消费者组中一个消费者消费 上面这段话还不够直观&#xff0c;我们举个例子来说明。 订单系统 订单消息通过 order_topic 发送,该topic 有 5个分区 结算系…

基于YOLO算法的网球运动实时分析-击球速度测量-击球次数(附源码)

这个项目通过分析视频中的网球运动员来测量他们的速度、击球速度以及击球次数。该项目使用YOLO&#xff08;You Only Look Once&#xff09;算法来检测球员和网球&#xff0c;并利用卷积神经网络&#xff08;CNNs&#xff09;来提取球场的关键点。此实战项目非常适合提升您的机…

基于 Web 的工业设备监测系统:非功能性需求与标准化数据访问机制的架构设计

目录 案例 【说明】 【问题 1】(6 分) 【问题 2】(14 分) 【问题 3】(5 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于 Web 系统架构设计的叙述&#xff0c;回答问题 1 至问题 3 。 【说明】 某公司拟开发一款基于 Web 的…

【JavaEE】多线程编程引入——认识Thread类

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能帮到你&#xff01; 目录 引入&#xff1a; 一&#xff1a;Thread类 1&#xff1a;Thread类可以直接调用 2&#xff1a;run方法 &a…

springboot每次都需要重设密码?明明在springboot的配置中设置了密码

第一步&#xff1a;查看当前的密码是什么&#xff1f; 打开redis-cli.exe&#xff0c;输入config get requirepass&#xff0c;查看当前的密码是什么&#xff1f; 接着&#xff0c;修改redis的配置文件&#xff0c;找到redis的安装目录&#xff0c;找到相关的conf文件&#x…

FreeRTOS下UART的封装

FreeRTOS下UART的封装_哔哩哔哩_bilibili Git使用的一个BUG&#xff1a; 当出现这个问题是因为git本身的安全证书路径有问题&#xff0c;我们需要重新指定路径 P1:UART程序层次

【2024】前端学习笔记7-颜色-位置-字体设置

学习笔记 1.定义&#xff1a;css2.颜色&#xff1a;color3.字体相关属性&#xff1a;font3.1.字体大小&#xff1a;font-size3.2.字体风格&#xff1a;font - style3.3.字体粗细&#xff1a;font - weight3.4.字体族&#xff1a;font - family 4.位置&#xff1a;text-align 1.…

K8s容器运行时,移除Dockershim后存在哪些疑惑?

K8s容器运行时&#xff0c;移除Dockershim后存在哪些疑惑&#xff1f; 大家好&#xff0c;我是秋意零。 K8s版本截止目前&#xff08;24/09&#xff09;已经发布到了1.31.x版本。早在K8s版本从1.24.x起&#xff08;22/05&#xff09;&#xff0c;默认的容器运行时就不再是Doc…

最新Kali Linux超详细安装教程(附镜像包)

一、镜像下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BfiyAMW6E1u9fhfyv8oH5Q 提取码&#xff1a;tft5 二、配置虚拟机 这里我们以最新的vm17.5为例。进行配置 1.创建新的虚拟机&#xff1a;选择自定义 2.下一步 3.选择稍后安装操作系统 4.选择Debian版本 因…

02_RabbitMQ消息丢失解决方案及死信队列

一、数据丢失 第一种&#xff1a;生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候&#xff0c;可能数据就在半路给搞丢了&#xff0c;因为网络问题&#xff0c;都有可能。 第二种&#xff1a;RabbitMQ 弄丢了数据。MQ还没有持久化自己挂了。 第三种&#xff1a;消费端…

Vue3新组件transition(动画过渡)

transition组件&#xff1a;控制V-if与V-show的显示与隐藏动画 1.基本使用 <template><div><button click"falg !falg">切换</button><transition name"fade" :enter-to-class"etc"><div v-if"falg&quo…

为什么git有些commit记录,只有git reflog可以看到,git log看不到?

文章目录 原因分析1. git log 只能显示 **可达的** 提交2. git reflog 记录所有引用的变更 常见导致 git log 看不到提交的原因1. git reset 操作2. git rebase 操作3. 分支删除4. git commit --amend5. 垃圾回收&#xff08;GC&#xff09;* 如何恢复 git log 看不到的提交&am…

数据库系统基础概述

文章目录 前言一、数据库基础概念 1.数据库系统的组成2.数据模型3.数据库的体系结构二、MySQL数据库 1.了解MySQL2.MySQL的特性3.MySQL的应用场景总结 前言 MySQL数据库是一款完全免费的产品&#xff0c;用户可以直接从网上下载使用&#xff0c;不用花费任何费用。这点对于初学…