华为OD机试真题 - 堆栈中的剩余数字 (D卷,100分)
题目描述
向一个空栈中依次存入正整数,假设入栈元素 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
用例
题目解析
- 创建一个空栈,用于存储输入的正整数。
- 遍历输入的正整数字符串,将每个数字依次入栈。
- 当新元素入栈时,检查栈顶的元素是否满足 n1=n2+…+ny 的条件,如果满足,则将栈顶的 y 个元素出栈,并将新元素 m(m=2*n1) 入栈。
- 重复步骤 3,直到所有输入的正整数都入栈完成。
- 最后,将栈中的元素依次出栈并输出。
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
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2024华为OD机试题库D卷 文章被收录于专栏
2024年5-11月份考的D卷,不用再看AB卷,CD卷题目一样。多种语言解法,欢迎提供更好的解法。