2016-12-19 6 views
-1

リスト内のすべての連続した繰り返し要素を数える方法と、それらの発生数をペアとしてパックする方法。リスト内の各文字の出現を数えるには?

例:

compress([])-> 
    []; 
compress(L)-> 
    helper(L,0). 

helper([], _)-> 
    []; 
helper([H|T], Count)-> 
    case H == hd(T) of 
     true -> helper(T,Count), [{Count+1, H}]; 
     false -> helper(T, Count), [{Count, H}] 
    end. 
+0

少なくとも、コンパイラの警告をクリーンアップすることができます。あなたはこの行で何をしたいですか? 'true - > Count + 1、ヘルパー(T、Count)、[{Count、H}];' –

答えて

2

この方法:

compress(L) -> 
    helper(L, []). 

helper([], Acc) -> lists:reverse(Acc); 
helper([H|T], [{Count, H}|Acc]) -> 
    helper(T, [{Count+1, H}|Acc]); 
helper([H|T], Acc) -> 
    helper(T, [{1, H}|Acc]). 

以上に簡単に

compress("Hello") == [{1,$H},{1,$e},{2,$l},{1,$o}] 

誰かが解決するために私を助けることができる、私はこの機能を試してみましたが、私はエラーを持っていますいくつかのプラットフォームではより速く(ガーベッジ生成が少ない)バージョン:

compress2([]) -> []; 
compress2([H|T]) -> 
    helper2(T, H, 1). 

helper2([H|T], H, Count) -> 
    helper2(T, H, Count+1); 
helper2([H|T], C, Count) -> 
    [{Count, C}|helper2(T, H, 1)]; 
helper2([], C, Count) -> 
    [{Count, C}]. 
関連する問題