通过给定数组创建堆栈并堆栈C#

时间:2018-04-11 09:56:39

标签: c# arrays stack

我最近去过面试,并被问到以下问题:

  

给定一个具有N个整数的数组A(1和N之间的不同数字)和一个具有N个整数的堆栈B(1和N之间的数字不同)。

     

数组A中项的值包含项在堆栈B上的索引(从顶部开始),数组A的索引号描述堆栈C在此项中的位置(从顶部开始)应该出现。

     

编写一个在O(N ^ 2)中运行的算法,没有任何进一步的空间复杂度(除了一个简单的变量),它将A和B作为参数并返回一个堆栈C,其中包含已按描述的顺序排列的N个项目

     

注意:在算法结束时,数组A和堆栈B的形式应与算法启动时的形式相同。

     

例如,给定一个包含以下整数的数组A:

|     index in the array    | 1 | 2 | 3 | 4 |
|:-------------------------:|---|---|---|---|
| final location in stack C | 2 | 4 | 1 | 3 |
  

和堆栈B看起来像这样(但它不必看起来像这样):

  • 2
  • 3
  • 4
  • 1
  

我们将返回以下Stack C:

  • 3
  • 1
  • 2
  • 4
  

一个例子:   在数组A中,我们得到第一个索引中的项应该出现在位置2的堆栈B上(值3)。我们将此值放在堆栈C的第一个位置(顶部)。

这是我执行此操作的C#代码(虽然它有几个问题)

    private static Stack generateStackFromArrayAndStack(int[] A, Stack B)
    {
        int N = A.Length;
        Stack C = new Stack();

        // Iterate over the given array. Notice that we start from the end because that is the value we want to push first to the C Stack.
        for (int i = N - 1; i >= 0; i--)
        {
            int value = 0;
            int j;

            // Look for the desired value. When we get to it, stop this iteration. We use the Stack C as a container for now
            for (j = 1; j <= N; j++)
            {
                value = (int)B.Pop();
                C.Push(value);
                if (j == A[i])
                    break;
            }

            // Return all the items we moved to C in the previous iteration back to B.  
            for (int k = j; k > 0; k--)
                B.Push(C.Pop());

            // Push the value we want to C.
            C.Push(value);
        }
        return C;
    }

我对此代码的问题是:

  1. 我使用了1个以上的简单变量。
  2. 在算法运行期间,堆栈C将包含多于N个元素。现在,我不确定是否允许这样做。如果你能找到一个不会导致这种情况的实施,那就太棒了。
  3. 当然,如果你有一个完全不同的实现,也可以提供帮助。

1 个答案:

答案 0 :(得分:0)

不知道这是否是O(N ^ 2),但它有效......

Data of the Experiment
Test started: Wed Mar 07 08:10:32 CET 2018
Time     Revolutions     Axial Force     Radial Force
0        0        0        0
10        3000        0        4000
172800        3000        0        4000
172800        2000        0        4000
180000        2000        0        4000
237600        3000        0        22000
237600        2000        0        22000
244800        2000        0        22000
244800        1000        0        22000
252000        1000        0        22000
252000        3000        0        4000
259200        3000        0        4000
Critical Temperature 1: 110
Critical Temperature 2: 120
Critical Temperature 3: 120
Critical Temperature 4: 110
Critical Vibration level: 3500
Critical Torque: 7000
Measurement values:
Time:   Seconds elapsed [s] Torque [Nm] Speed [1/s] 
20180307081032: 210025.02   5.25    0.00    
20180307081033: 210025.98   17.50   3000.00 
20180307081034: 210026.97   1688.75 3000.00 
.
.