news 2026/4/16 15:22:32

(新卷,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/4/16 4:31:38

weixin193基于微信小程序的社区垃圾回收管理系统ssm(源码)_kaic

第5章 系统实现系统实现这个章节的内容主要还是展示系统的功能界面设计效果&#xff0c;在实现系统基本功能&#xff0c;比如修改&#xff0c;比如添加&#xff0c;比如删除等管理功能的同时&#xff0c;也显示出系统各个功能的界面实现效果&#xff0c;该部分内容一方面与前面…

作者头像 李华
网站建设 2026/4/16 11:02:02

OpenAI详细披露AI编程智能体核心运行机制

OpenAI工程师迈克尔博林日前发布了该公司Codex CLI编程智能体内部工作机制的详细技术解析&#xff0c;为开发者深入了解这类能够编写代码、运行测试并修复Bug的AI编程工具提供了宝贵洞察。这一技术披露补充了我们此前关于AI智能体工作原理的报道&#xff0c;详细揭示了OpenAI如…

作者头像 李华
网站建设 2026/4/16 10:43:20

微信记录2020(二)

瘟疫成灾&#xff0c;像洪水猛兽&#xff0c;被迫上山落草&#xff0c;这救济粮&#xff08;红豆豆&#xff09;&#xff0c;够不够吃半年&#xff1f;不够&#xff0c;水库捕鱼。哈哈&#xff01;02021610在外面混&#xff0c;要保护好自己&#xff0c;病毒汹涌啊&#xff01;…

作者头像 李华
网站建设 2026/4/16 10:45:48

数据说话,2026国自然或许是最难的一年

国自然申报季的钟声早已敲响&#xff0c;2026年集中接收期已明确为3月1日至3月20日16时&#xff0c;万千科研人正全力冲刺申请书撰写。回望2024-2025年国自然资助全貌&#xff0c;一组组数据背后&#xff0c;不仅是资助导向的细微调整&#xff0c;更暗藏着逐年加剧的竞争信号—…

作者头像 李华
网站建设 2026/4/16 14:01:36

Uncertainty-Aware Bayesian PINN机械退化趋势预测(Pytorch)

算法特点贝叶斯不确定性量化&#xff0c;将贝叶斯神经网络与物理信息神经网络结合&#xff0c;提供预测结果的不确定性区间&#xff0c;解决传统黑箱模型信任度低的问题自适应物理约束学习&#xff0c;通过可学习物理权重参数&#xff0c;动态平衡数据驱动与物理规律约束&#…

作者头像 李华