我最近被问到这个面试问题: 如何检索堆栈中的前5个项目? 如你所知,堆栈是后进先出 采访者要求只有2个操作的Pop()和Push()的高性能算法/伪代码. 我琐碎的回答: Stack S2;foreach (item i
如何检索堆栈中的前5个项目?
如你所知,堆栈是后进先出
采访者要求只有2个操作的Pop()和Push()的高性能算法/伪代码.
我琐碎的回答:
Stack S2; foreach (item in stack S1) { object item = S1.Pop(); S2.push(item) } for (int i=0 ; i<5 ; i++) Printf(S2.Pop());
他告诉我,我们有另一个性能更高的解决方案,但我找不到一个.
似乎是一个沟通问题.要获得放入堆栈的前五个元素,我将执行以下操作:input: Stack S1; Stack S2; Stack S3; Object[5] elementArray; int elementIndex = 0; foreach (item in Stack S1) { elementArray[elementIndex] = item; elementIndex = ++elementIndex % 5 // modulus operation. S2.push(item); // only needed to restore S1 to its' original state. } elementIndex = ++elementIndex % 5 // advance to the 5th element from the bottom. for (int index = 0; index < 5; ++index) { S3.push(elementArray[elementIndex]); elementIndex = ++elementIndex % 5 } foreach (item in Stack S2) { S1.push(item); }
最终结果:
> S1没有变化.> S2是空的.> S3包含来自堆栈S1的前五个元素(我认为这些是底部的5个元素).