news 2026/2/28 14:04:05

(新卷,100分)- 堆栈中的剩余数字(Java JS Python)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(新卷,100分)- 堆栈中的剩余数字(Java JS Python)

(新卷,100分)- 堆栈中的剩余数字(Java & JS & Python)

题目描述

向一个空栈中依次存入正整数,假设入栈元素 n(1<=n<=2^31-1)按顺序依次为 nx…n4、 n3、n2、 n1, 每当元素入栈时,如果 n1=n2+…+ny(y 的范围[2,x], 1<=x<=1000),则 n1~ny 全部元素出栈,重新入栈新元素 m(m=2*n1)。

如:依次向栈存入 6、 1、 2、 3, 当存入 6、 1、 2 时,栈底至栈顶依次为[6、 1、 2];当存入 3时, 3=2+1, 3、 2、 1 全部出栈,重新入栈元素 6(6=2*3),此时栈中有元素 6;

因为 6=6,所以两个 6 全部出栈,存入 12,最终栈中只剩一个元素 12。

输入描述

使用单个空格隔开的正整数的字符串,如”5 6 7 8″, 左边的数字先入栈,输入的正整数个数为 x, 1<=x<=1000。

输出描述

最终栈中存留的元素值,元素值使用空格隔开,如”8 7 6 5″, 栈顶数字在左边。 6 1 2 3

用例
输入5 10 20 50 85 1
输出1 170
说明5+10+20+50=85, 输入 85 时, 5、 10、 20、 50、 85 全部出栈,入栈 170,最终依次出栈的数字为 1 和 170。
输入6 7 8 13 9
输出9 13 8 7 6
说明
输入1 2 5 7 9 1 2 2
输出4 1 9 14 1
说明
题目解析

本题较为简单的解题思路是:

每当有元素num将要入栈前,都尝试num去依次减去栈顶到栈底方向的栈中元素(注意这只是遍历栈的过程,而不是弹栈过程):

  1. 如果有出现num == 0,则将遍历过栈元素全部弹栈,并压入num * 2。
  2. 如果没有出现num == 0,则栈不做变动,只压栈num

但是需要注意的是,对于情况1而言,我们需要注意题目描述中的这句话:

每当元素入栈时,如果 n1=n2+…+ny(y 的范围[2,x], 1<=x<=1000),则 n1~ny 全部元素出栈,重新入栈新元素 m(m=2*n1)

那么压栈 num * 2 是否也算新元素入栈呢?是否需要继续检查等价栈元素呢?

我理解是需要的,即这个压栈num * 2 的过程是一个需要递归的过程。

Java算法源码
import java.util.Arrays; import java.util.LinkedList; import java.util.Scanner; import java.util.StringJoiner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray(); System.out.println(getResult(nums)); } public static String getResult(int[] nums) { LinkedList<Integer> stack = new LinkedList<>(); stack.add(nums[0]); for (int i = 1; i < nums.length; i++) { push(nums[i], stack); } StringJoiner sj = new StringJoiner(" "); while (stack.size() > 0) { sj.add(stack.removeLast() + ""); } return sj.toString(); } public static void push(int num, LinkedList<Integer> stack) { int sum = num; for (int i = stack.size() - 1; i >= 0; i--) { sum -= stack.get(i); if (sum == 0) { stack.subList(i, stack.size()).clear(); push(num * 2, stack); return; } else if (sum < 0) { break; } } stack.add(num); } }
JS算法源码
/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on("line", (line) => { const nums = line.split(" ").map(Number); console.log(getResult(nums)); }); function getResult(nums) { const stack = [nums[0]]; for (let i = 1; i < nums.length; i++) { push(nums[i], stack); } return stack.reverse().join(" "); } function push(num, stack) { let sum = num; for (let i = stack.length - 1; i >= 0; i--) { sum -= stack[i]; if (sum == 0) { stack.splice(i); push(num * 2, stack); return; } else if (sum < 0) { break; } } stack.push(num); }
Python算法源码
# 输入获取 nums = list(map(int, input().split())) def push(num, stack): total = num for i in range(len(stack)-1, -1, -1): total -= stack[i] if total == 0: del stack[i:] push(num * 2, stack) return elif total < 0: break stack.append(num) # 算法入口 def getResult(): stack = [nums[0]] for i in range(1, len(nums)): push(nums[i], stack) stack.reverse() return " ".join(map(str, stack)) # 算法调用 print(getResult())
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/26 15:46:33

社会网络仿真软件:NetLogo_(4).NetLogo编程基础

NetLogo编程基础 在这一节中&#xff0c;我们将详细介绍NetLogo编程的基础知识&#xff0c;包括NetLogo的基本概念、环境设置、编程语言特性以及如何创建和运行简单的模型。通过这一节的学习&#xff0c;您将能够掌握NetLogo的基本编程技巧&#xff0c;为后续的复杂模型开发打下…

作者头像 李华
网站建设 2026/2/25 20:18:21

社会网络仿真软件:NetLogo_(6).数据导入与导出

数据导入与导出 在社会网络仿真软件NetLogo中&#xff0c;数据导入与导出是两个非常重要的功能&#xff0c;它们使得仿真模型能够与外部数据进行交互&#xff0c;从而增强模型的灵活性和实用性。通过数据导入&#xff0c;用户可以从外部文件中加载数据&#xff0c;用于初始化模…

作者头像 李华
网站建设 2026/3/1 7:27:44

【Matlab】MATLAB矩阵子矩阵索引详解:从语法案例到分块应用

MATLAB矩阵子矩阵索引详解:从语法案例到分块应用 在MATLAB矩阵操作体系中,子矩阵索引是比整行/列索引更灵活的核心技能,能够精准提取矩阵中任意连续或离散的子区域数据。无论是数据分块处理、局部特征提取,还是复杂数值计算中的区域运算,子矩阵索引都发挥着不可替代的作用…

作者头像 李华
网站建设 2026/2/27 7:14:36

Clawedbot 完整对接飞书教程 手把手搭建你的专属 AI 助手

Clawedbot 完整对接飞书教程 手把手搭建你的专属 AI 助手 注意本教程在 Linux 系统下进行 Clawdbot 由于 Claude 的版权问题&#xff0c;已更名为 Moltbot&#xff0c;因此本教程基于最新版本编写。下面进入安装流程 首先准备一台闲置的云服务器或 VPS&#xff08;推荐使用香港…

作者头像 李华
网站建设 2026/2/26 22:39:48

程序员如何利用AI进行数据可视化

程序员如何利用AI进行数据可视化 关键词:程序员、AI、数据可视化、算法原理、应用场景 摘要:本文旨在为程序员提供全面且深入的指导,详细阐述如何利用AI进行数据可视化。首先介绍相关背景知识,包括目的范围、预期读者等内容。接着讲解核心概念与联系,通过文本示意图和Merm…

作者头像 李华
网站建设 2026/2/24 19:01:26

GitHub MCP

在TRAE中集成GitHub MCP&#xff0c;相当于给你的AI助手配备了一套可以直接查询、操作GitHub仓库的专业工具。这能让AI在理解你的项目背景、生成相关代码或操作建议时&#xff0c;获得更精确的上下文。&#x1f527; 配置GitHub MCP Server你需要准备一个GitHub Personal Acces…

作者头像 李华