华为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

用例

题目解析

  1. 创建一个空栈,用于存储输入的正整数。
  2. 遍历输入的正整数字符串,将每个数字依次入栈。
  3. 当新元素入栈时,检查栈顶的元素是否满足 n1=n2+…+ny 的条件,如果满足,则将栈顶的 y 个元素出栈,并将新元素 m(m=2*n1) 入栈。
  4. 重复步骤 3,直到所有输入的正整数都入栈完成。
  5. 最后,将栈中的元素依次出栈并输出。

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卷题目一样。多种语言解法,欢迎提供更好的解法。

全部评论
机试350分,十分感谢
点赞
送花
回复 分享
发布于 06-21 12:13 广东

相关推荐

头像
不愿透露姓名的神秘牛友
05-27 11:41
已编辑
点赞 评论 收藏
分享
2 1 评论
分享
牛客网
牛客企业服务