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

news2024/9/22 14:35:21

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.coloradmin.cn/o/2155270.html

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

相关文章

MATLAB入门基础篇

1. 数值计算和符号计算功能 在MATLAB环境中,有超过500种数学、统计、科学及工程方面的函数可使用,函数的标示自然,使得问题和解答像数学式子一般简单明了,让使用者可全力发挥在解题方面,而非浪费在电脑操作上. 2.图形功能 利用MATLAB的高级图形命令可以轻而易举地绘…

LangChain基础知识大全

LangChain基础知识大全 一、部署ChatGLM-6B1.拉取源码2.安装环境3.下载模型4.修改api.py配置5.运行api.py 二、Models组件1.LLM&#xff08;大语言模型&#xff09;2.Chat Model&#xff08;聊天模型&#xff09;3.Embedding Model&#xff08;嵌入模型&#xff09;3.1 下载中文…

介绍 2款 Oracle 开发工具

准备工作 Oracle SQL Developer 下载&#xff08;免费&#xff09; Oracle 的官方网站下载 Oracle SQL Developer。以下是下载的步骤&#xff1a; 访问 Oracle SQL Developer 官方下载页面。点击页面上的“下载”链接。选择适合你操作系统的版本&#xff08;Windows、macO…

Spark原理及调优

spark官档 hints&#xff1a;https://spark.apache.org/docs/3.0.0/sql-ref-syntax-qry-select-hints.html调优参数&#xff1a;https://spark.apache.org/docs/latest/sql-performance-tuning.html#join-strategy-hints-for-sql-queries作者几乎把所有的RDD API查了个遍&…

Python 中的 Socket 编程入门

Python 中的 Socket 编程入门 Socket 编程是网络编程的重要组成部分&#xff0c;允许计算机通过网络进行通信。在 Python 中&#xff0c;使用内置的 socket 模块&#xff0c;开发者可以轻松地实现客户端和服务器之间的交互。本文将详细介绍 Python 中的 Socket 编程&#xff0…

微服务Docker相关指令

1、拉取容器到镜像仓库 docker pull xxx //拉取指令到 镜像仓库 例如 docker pull mysql 、docker pull nginx docker images //查看镜像仓库 2、删除资源 2.1、删除镜像仓库中的资源 docker rmi mysql:latest //删除方式一&#xff1a;格式 docker rmi 要…

19.初始C语言指针

初始C语言指针 1.指针的认识2.指针变量的引入3.指针变量的类型4.指针的应用场景15.指针的应用场景26.作业 1.指针的认识 指针 地址 //int a 10; //类型 变量名 内存地址 值 1.变量名直接访问2.通过地址访问&&#xff1a;取地址运算符* &#xff1a;将地址内的值读取…

数据库数据恢复—Oracle报错“需要更多的恢复来保持一致性”的数据恢复案例

Oracle数据库故障&检测&#xff1a; 打开oracle数据库报错“system01.dbf需要更多的恢复来保持一致性&#xff0c;数据库无法打开”。 数据库没有备份&#xff0c;无法通过备份去恢复数据库。用户方联系北亚企安数据恢复中心并提供Oracle_Home目录中的所有文件&#xff0c;…

GitHub 上高星 AI 开源项目推荐

FIFO-Diffusion 介绍&#xff1a;FIFO-Diffusion 是一个创新的开源项目&#xff0c;它能够基于文本描述生成无限长度的高品质视频&#xff0c;而无需任何预先的模型训练。这一技术的核心在于其高效的内存管理策略和先进的扩散模型&#xff0c;使得即使是小型GPU配置也能轻松应…

1018. 可被 5 整除的二进制前缀

目录 一&#xff1a;题目&#xff1a; 二&#xff1a;代码&#xff1a; 三&#xff1a;结果&#xff1a; 一&#xff1a;题目&#xff1a; 给定一个二进制数组 nums ( 索引从0开始 )。 我们将xi 定义为其二进制表示形式为子数组 nums[0..i] (从最高有效位到最低有效位)。 …

数据结构之栈(python)

栈&#xff08;顺序栈与链栈&#xff09; 1.栈存储结构1.1栈的基本介绍1.2进栈和出栈1.3栈的具体实现1.4栈的应用例一例二例三 2.顺序栈及基本操作&#xff08;包含入栈和出栈&#xff09;2.1顺序栈的基础介绍2.2顺序栈元素入栈2.3顺序栈元素出栈2.4顺序栈的表示和实现 3.链栈及…

IDEA去除掉虚线,波浪线,和下划线实线的方法

初次安装使用IDEA&#xff0c;总是能看到导入代码后&#xff0c;出现很多的波浪线&#xff0c;下划线和虚线&#xff0c;这是IDEA给我们的一些提示和警告&#xff0c;但是有时候我们并不需要&#xff0c;反而会让人看着很不爽&#xff0c;这里简单记录一下自己的调整方法&#…

Linux:权限管理

基本权限和归属 权限和归属 基本权限与归属 • 访问权限 – 读取&#xff1a;允许查看内容-read – 写入&#xff1a;允许修改内容-write – 可执行&#xff1a;允许运行和切换-excute对于文本文件&#xff1a;r读取权限&#xff1a;cat、less、grep、head、tailw写入权限&am…

linux下共享内存的3种使用方式

进程是资源封装的单位&#xff0c;内存就是进程所封装的资源的一种。一般情况下&#xff0c;进程间的内存是相互隔离的&#xff0c;也就是说一个进程不能访问另一个进程的内存。如果一个进程想要访问另一个进程的内存&#xff0c;那么必须要进过内核这个桥梁&#xff0c;这就是…

中国雕塑—孙溟㠭凿刻印《自然贼》

中国雕塑孙溟㠭凿刻作品《自然贼》 孙溟㠭凿刻印《自然贼》 遵循自然之法谓之道&#xff0c;脱离自然之道谓之贼&#xff0c;道法自然。丙申秋月溟展刊。 孙溟㠭凿刻印《自然贼》 这方《自然贼》&#xff0c;红木章料&#xff0c;半尺见方&#xff0c;自然古朴&#xff0c;浑…

摆脱困境并在iPhone手机上取回删除照片的所有解决方案

您是否无意中从 iPhone 中删除了照片&#xff1f;您&#xff0c;无需惊慌&#xff0c;因为您可以使用以下方法恢复所有照片。 如果您长时间使用 iPhone&#xff0c;您应该知道 iOS 提供了许多 Android 不提供的备份功能。例如&#xff0c;您的所有照片都会自动备份到 iCloud 存…

【机器学习(七)】分类和回归任务-K-近邻 (KNN)算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09;K值选择&#xff08;二&#xff09;距离度量1、欧式距离2、曼哈顿距离3、闵可夫斯基距离 &#xff08;三&#xff09;决策规则1、分类决策规则2、回归决策规则 三、算法优缺点优点缺点 四、KNN分类任务实现对比&am…

音视频生态下Unity3D和虚幻引擎(Unreal Engine)的区别

技术背景 好多开发者跟我们做技术交流的时候&#xff0c;会问我们&#xff0c;为什么有Unity3D的RTMP|RTSP播放模块&#xff0c;还有RTMP推送和轻量级RTSP服务模块&#xff0c;为什么不去支持虚幻引擎&#xff1f;二者区别在哪里&#xff1f;本文就Unity3D和虚幻引擎之间的差异…

idea上传jar包到nexus

注意&#xff1a;确保idea中项目为maven项目&#xff0c;并且在nexus中已经创建了maven私服。 1、配置pom.xml中推送代码配置 <distributionManagement> <repository> <id>releases</id> <url>http://127.0.0.1:8001/repository/myRelease/<…

鼻咽癌中三级淋巴结构的单细胞与空间转录组分析|文献精析·24-09-22

小罗碎碎念 研究团队通过单细胞和空间转录组分析&#xff0c;揭示了与鼻咽癌进展和免疫治疗反应相关的三级淋巴结构。 作者角色作者姓名单位&#xff08;中文&#xff09;第一作者Yang Liu/通讯作者Jin-Xin Bei国家癌症中心南方肿瘤学重点实验室&#xff0c;鼻咽癌诊断治疗广东…