此问题在此处已有答案:
How to efficiently read thousand of lines from STDIN in Erlang?(2个答案)
两年前关闭了。
这是一个常见的编程问题,我用Python、Java等语言做过,没有问题。下面的Erlang(我刚刚开始学习)运行得很慢(10^5次操作需要大约44秒的用户时间),我不知道为什么。
正如HackerRank上所写的,程序从stdin
中取出一行,用一个整数表示后面的操作数,后面的每一行应该是1 X
(入队X)、2
(出队并丢弃)或3
(查看并打印队列中的下一个值)。lists:reverse/1
是否使用错误?
-module(two_stacks).
%% API exports
-export([main/1]).
enqueue(Num, F, B) ->
{[Num | F], B}.
dequeue(F, []) ->
[_|B] = lists:reverse(F),
{[], B};
dequeue(F, [_|B]) ->
{F, B}.
peek(F, []) ->
[H|T] = lists:reverse(F),
io:format(H),
{[], [H|T]};
peek(F, [H|T]) ->
io:format(H),
{F, [H|T]}.
dispatchOperation(_, {F, B}) ->
[Code|Line] = io:get_line(""),
case Code of
49 ->
[_|Num] = Line,
enqueue(Num, F, B);
50 -> dequeue(F, B);
51 -> peek(F, B)
end.
main(_) ->
{Count, _} = string:to_integer(io:get_line("")),
_ = lists:foldl(fun dispatchOperation/2, {[], []}, lists:seq(1, Count)),
erlang:halt(0).
字符串
https://www.hackerrank.com/challenges/queue-using-two-stacks/problem
2条答案
按热度按时间zqdjd7g91#
您运行的是escript吗?如果是这样的话,您应该在那里添加一个
-mode(compile).
,否则它将以解释模式运行脚本。此外,您还可以比较使用queue模块(使用两个堆栈实现)的时间
c90pui9n2#
问题出在解析输入的方式上,请参见46493207。
因为所有的输入都是整数,所以我可以使用这里使用的相同技术。完整的代码是: