リストを反復する(結果として新しいリストを返す)1つの方法は、再帰とパターンマッチングを使用しています。
リストをソートした後、リストを繰り返し、次の要素と異なるだけでなく、その前に他の等しい要素がないことをチェックします。次の要素のみをチェックする場合はリスト[3,3,3,5,5]
を考えてください。最後の3
も一意であり、間違っています。
ここでは動作するプログラムですが、上記のケースもカバーするためにカウンタを使用しました。リストの反復処理には[H|T]
の構文を参照してください。あなたはもっと多くのケースを見て、それについてもっと読むかもしれませんhere。値をカウントしてから一度だけ存在していなかった値をフィルタする
-module(test).
-export([remove_unique/1]).
remove_unique(Input) ->
Sorted = lists:sort(Input),
remove_unique(Sorted, [], 0).
% Base case - checks if element is unique
remove_unique([H|[]],Output,Count) ->
case Count of
0 -> Output;
_Other -> [H|Output]
end;
% Count is 0 - might be unique - check with next element
remove_unique([H1|[H2|T]],Output, 0)->
case (H1 =:= H2) of
true -> remove_unique([H2|T],[H1|Output],1);
false -> remove_unique([H2|T],Output,0)
end;
% Count is > 0 - not unique - proceed adding to list until next value
remove_unique([H1|[H2|T]],Output,Count) ->
case (H1 =:= H2) of
true -> remove_unique([H2|T],[H1|Output],Count+1);
false -> remove_unique([H2|T],[H1|Output],0)
end.
テスト
7> test:remove_unique([1,2,3,3,3,5,5,6,7,7]).
[7,7,5,5,3,3,3]
8> test:remove_unique([1,2,3,3,3,5,5,6,7,8]).
[5,5,3,3,3]
最高のソリューションをありがとう@Hynek –
地図を使用して非常にいいと単純化されたソリューション。好奇心のためだけに、 'maps:'の時間の複雑さは何ですか? –
@A.Sarid:理論上はO(1)であるが、実際はO(logN)である。私は、メモリまたはメモリそのものに線形のアドレス配列を含む実際に結合されていないK/VストレージのO(1)アクセス時間を持つ技術を聞いたり、見たことがありませんでした。実際に結合されていない解を考えるなら、この解はO(N * logN)です。 –