news 2026/5/11 5:00:13

(新卷,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/5/9 6:58:11

11、C语言程序设计:_FUNCTION__ 宏在嵌入式开发中的应用

1. 基本介绍__FUNCTION__ 是C语言的一个特殊预定义标识符&#xff0c;它在编译时会被替换为当前函数的名字&#xff08;字符串常量&#xff09;。__FUNCTION__ 的主要优势&#xff1a; 【1】自动获取函数名 - 无需手动输入&#xff0c;减少错误 【2】代码维护方便 - 函数重命名…

作者头像 李华
网站建设 2026/5/10 17:30:10

weixin194高校学习助手小程序ssm(源码)_kaic

第5章 系统实现 进入到这个环节&#xff0c;也就可以及时检查出前面设计的需求是否可靠了。一个设计良好的方案在运用于系统实现中&#xff0c;是会帮助系统编制人员节省时间&#xff0c;并提升开发效率的。所以在系统的编程阶段&#xff0c;也就是系统实现阶段&#xff0c;对于…

作者头像 李华
网站建设 2026/5/8 8:29:27

社会网络仿真软件:NetLogo_(10).NetLogo高级编程技巧

NetLogo高级编程技巧 在前一节中&#xff0c;我们已经了解了NetLogo的基础编程和模型构建方法。本节将深入探讨NetLogo的一些高级编程技巧&#xff0c;帮助你更高效、更灵活地构建复杂的社会网络仿真模型。这些技巧包括但不限于&#xff1a;高级数据结构的使用、优化模型性能、…

作者头像 李华
网站建设 2026/5/11 2:19:18

业务复杂也能零代码?XinServer 可视化建表解析

业务复杂也能零代码&#xff1f;XinServer 可视化建表解析 最近跟几个做前端和移动端的朋友聊天&#xff0c;发现大家普遍有个头疼事儿&#xff1a;项目一到需要后端支持的时候&#xff0c;进度就卡壳。要么得等后端排期&#xff0c;要么自己硬着头皮去学 Node.js、Spring Boo…

作者头像 李华