我最近去过面试,并被问到以下问题:
给定一个具有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看起来像这样(但它不必看起来像这样):
我们将返回以下Stack C:
一个例子: 在数组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;
}
我对此代码的问题是:
当然,如果你有一个完全不同的实现,也可以提供帮助。
答案 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
.
.