【问题标题】:Delete the first half elements from stack of integer从整数堆栈中删除前半部分元素
【发布时间】:2021-01-05 02:25:03
【问题描述】:

给你一个包含 n 个整数的栈。您需要从堆栈底部删除 floor(n/2) 个元素并打印堆栈的剩余元素。其余元素应按插入堆栈的顺序打印。

floor(3.5) 将输出为 3,最大整数小于或等于输入。 输入格式: 输入的第一行是一个整数 n,表示堆栈的大小。下一行包含 n 个空格分隔的整数。 输出格式: 移除所需元素后堆栈的剩余元素。 例子: 堆栈(底部 -> 顶部)= [1, 2, 3, 4, 5, 6] 输出:[4,5,6]

堆栈 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 输出:[6, 7, 8, 9, 10, 11]

示例输入: 12 1 2 3 4 5 6 7 8 9 10 11 12

样本输出: [7、8、9、10、11、12]

示例输入: 19 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

样本输出: [10、11、12、13、14、15、16、17、18、19]

我的问题是我的代码通过了测试用例 1 和测试用例 2,但在测试用例 3 中,样本输入为 19 应该打印如上所述的输出,但我的输出来自 [11、12、13、14、15 , 16, 17, 18, 19] 它省略了第 10 个元素,我不知道我的错误在哪里。所以请在这方面帮助我

我的代码 -

import java.util.*;

public class DeleteElement {
    public static void main(String args[]) {
        Stack<Integer> stack = new Stack<>();
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        while (n-- > 0)
            stack.push(s.nextInt());
        deleteFirstHalf(stack, stack.size(), 0);
        System.out.println(stack);
    }

    static void deleteFirstHalf(Stack<Integer> stack, int n, int curr) {


        if(stack.empty() || curr == n) {
            return;
        }
        int x = stack.pop();

        deleteFirstHalf(stack, n, curr+1);

        if(curr<Math.floor(n/2)){
            stack.push(x);
        }
    }
}

注意 - 不要更改我的代码中的 main()。

【问题讨论】:

    标签: java stack


    【解决方案1】:

    您的错误来自这样一个事实,即您应该删除底部的 floor(n/2) 元素,但您却保留了顶部的 floor(n/2) 元素。它适用于某些测试用例的原因是,当 n 为偶数时,保留顶部 n/2 个元素与删除底部 n/2 个元素相同。当 n 为奇数时,代码应保留一个额外的元素。

    解决方法是将if (curr &lt; Math.floor(n/2)) 改为if (curr &lt; n/2 + n%2)。一方面,您可以放弃Math.floor(),因为整数除法无论如何都会进行地板除法。关键区别在于添加了n%2n%2 在 n 为偶数时计算为 0,在 n 为奇数时计算为 1。如果 n 是奇数,它的作用是使代码保留一个额外的元素。 (在第 3 个测试用例的情况下,它将保留 10 而不是删除它)如果 n 是偶数,n%2 的计算结果为 0,因此算法的行为与之前相同。

    【讨论】:

    • 不,我已经尝试过你的方法,但如果我使用它,那么它会失败我的测试用例 1 和 2 你试试@a.deshpande012
    • @soumyaranjantripathy 你是对的,我错过了一个错误。检查更新的答案。
    【解决方案2】:

    代替 curr 尝试 n-curr > Math.floor(n/2)

    【讨论】:

      【解决方案3】:

      代替 (curr

      【讨论】:

        【解决方案4】:

        我实际上尝试了另一种方法,我创建了 2 个不同的堆栈 temptemp1,而不是递归调用我进行内部检查并在最后打印输出的函数

        static void deleteFirstHalf(Stack<Integer> stack) {
            Stack<Integer> temp = new Stack<Integer>();
            Stack<Integer> temp1 = new Stack<Integer>();
            int i = stack.size();
            int dest = stack.size() / 2;
            while (i-- > dest) {
                int t = stack.pop();
                temp.push(t);
              }
            while (!temp.empty()) {
                int t = temp.pop();
                // System.out.print(i + " size");
                temp1.push(t);
            }
            System.out.print(temp1);
        }
        

        【讨论】:

          猜你喜欢
          • 2020-12-11
          • 1970-01-01
          • 2021-05-27
          • 2013-11-07
          • 1970-01-01
          • 1970-01-01
          • 2020-08-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多