您可以在此处阅读第5天的完整说明。
总而言之,第1部分,我们得到了许多堆栈,每个堆栈可能包含许多板条箱。而且,您必须应用移动操作,以将板条箱从一个堆栈移动到另一个堆栈,在所有堆栈完成移动操作后,我们需要找出每个堆栈顶部的板条箱结束。
为了解决这个问题,我们只需要使用堆栈数据结构来容纳我们的板条箱,以防万一:
堆栈是最终的(LIFO)数据结构,它是一种抽象数据类型,通常由数组或列表实现。
push()操作将元素添加到堆栈顶部。pop()操作删除了堆栈的最高元素。
但是首先,我们需要解析输入以获得初始板条设置以及移动操作,这是示例输入:
[Q] [N] [N] [H] [B] [D] [S] [M] [C] [Q] [J] [V] [Q] [D] [T] [S] [Z] [F] [J] [J] [W] [N] [G] [T] [S] [V] [B] [C] [C] [S] [B] [R] [W] [D] [J] [Q] [R] [Q] [V] [D] [W] [G] [P] [W] [N] [T] [S] [B] [W] [F] [L] [M] [F] [L] [G] [J] 1 2 3 4 5 6 7 8 9 move 3 from 6 to 2 move 2 from 8 to 7 move 3 from 3 to 8 move 2 from 5 to 3 move 5 from 9 to 7
为了使板条箱解析过程更容易,在这里,对于尚未完全填充的堆栈,我们将[-]板条箱添加到它们:
[Q] [-] [-] [N] [-] [-] [-] [N] [-] [H] [-] [B] [D] [-] [-] [-] [S] [M] [C] [-] [Q] [J] [-] [-] [V] [Q] [D] [T] [-] [S] [Z] [F] [-] [J] [J] [W] [N] [G] [T] [S] [V] [-] [B] [C] [C] [S] [B] [R] [W] [D] [J] [Q] [R] [Q] [V] [D] [W] [G] [P] [W] [N] [T] [S] [B] [W] [F] [L] [M] [F] [L] [G] [J] 1 2 3 4 5 6 7 8 9
现在,我们准备解析板条箱设置,我们有9种不同的堆栈,因此理想情况下,我们希望这样的每个相关板条箱这样:
public static Map < Integer , Stack < Character > > getCrates ( String input ) {Map < Integer , Stack < Character > > stacks = new HashMap < >() ;List < List < String > > lines = input . lines (). limit ( 8 ). map ( x - > Arrays . stream ( x . split ( " \ s+ " )). collect ( Collectors . toList ())). collect ( Collectors . toList ()) ;for ( int i = lines . size () - 1 ; i >= 0 ; i -- ) {List < String > crates = lines . get ( i ) ;for ( int j = 0 ; j < crates . size () ; j ++ ) {Character label = getLabel ( crates . get ( j )) ;if ( ! label . equals ( '