我刚刚读了这个帖子,觉得很有趣。
我在几分钟内实现了从左侧删除
函数:
(*
* remove duplicate from left:
* 1 2 1 3 2 4 5 -> 1 2 3 4 5
* *)
let rem_from_left lst =
let rec is_member n mlst =
match mlst with
| [] -> false
| h::tl ->
begin
if h=n then true
else is_member n tl
end
in
let rec loop lbuf rbuf =
match rbuf with
| [] -> lbuf
| h::tl ->
begin
if is_member h lbuf then loop lbuf tl
else loop (h::lbuf) rbuf
end
in
List.rev (loop [] lst)
我知道可以通过使用Map
或hashtable
来实现is_member
以使其更快,但此时这并非我的关注重点。
在实现从右侧删除
时,我可以使用List.rev
来实现:
(*
* remove duplicate from right:
* 1 2 1 3 2 4 5 -> 1 3 2 4 5
* *)
let rem_from_right lst =
List.rev (rem_from_left (List.rev lst))
我在想是否可以用另一种方式实现它?