vik*_*iii 18 java arrays algorithm collections
我今天在Java采访中得到了这个问题.
我要实现的集合,其是一个数组,并且具有add
和delete
它只能在一个阵列的端执行的方法.
除此之外,我还要实现另外两个方法,即只能执行一次的方法undo
和redo
方法.
例如:
设x为包含的数组 {1,5,7,9}.
现在我加入{44,66,77}
并制作它{1,5,7,9,44,66,77}
.
现在当我撤消它时,数组应该删除{44,66,77}
.如果我之后重做,那应该回来了{1,5,7,9,44,66,77}
.
同样的删除.
在复杂性和记忆方面实现这一目标的最佳方法是什么?
我对面试官的解决方案:
根据采访者的说法,这是一个完全错误的解决方案
ser*_*nka 12
我会像这样解决它.基本上,将有三个列表.
Command
接口实例撤消列表带有Command
接口实例的重做列表(可选,如下所述)
public interface Command {
void do();
void undo();
}
Run Code Online (Sandbox Code Playgroud)将有两个Command
实现:AddCommand
和RemoveCommand
.
add()
,新建实例AddCommand
创建并添加到撤消列表中.然后我们调用do()
这个命令,它修改实际值和index
添加项的存储.remove()
,新建实例RemoveCommand
创建并添加到撤消列表中.然后我们调用do()
此命令,该命令修改实际值以及index
已删除项的存储和值.undo()
我们从拉最后的命令撤销列表,并执行undo()
该命令的方法.该命令被推送到重做列表.撤消方法AddCommand
并RemoveCommand
还原更改.redo()
我们从拉最后一个命令重做列表,并执行do()
再次方法.拉出的命令被添加到撤消列表中.另一个优化是删除重做列表并使用撤销索引.在这种情况下undo()
,您不需要从列表中删除/添加值,而只需将撤消索引减一.同样,redo()
将它增加一个.
因此,最终解决方案将具有值列表,撤消列表和索引值.
更新:
对于最简单的情况,只需要一个undo()
/ redo()
操作,解决方案看起来会更简单.它不是具有撤销列表和索引,而是存储最新的命令实例.因此,我们将有一个值列表和最后一个撤消命令的实例.
要么我误解了这个问题,要么人们正在过度思考这个问题.这个问题有很多限制,所以:
然后在每个不同的操作上更新这些.不需要堆栈或任何东西,因为不需要多次撤消/重做.