gpt4 book ai didi

elixir - 对 Elixir 中的重复字母进行分组或计数

转载 作者:行者123 更新时间:2023-12-02 09:52:12 24 4
gpt4 key购买 nike

我正在尝试计算 Elixir 中字符串上的重复字母。我确实尝试过一些尝试,但到目前为止还没有成功。

我们以这个字符串为例:"AAAABBAAC"

所需的输出为“3A2B2A1C”

将此字符串转换为 List,我能够对每个字母进行计数,得到 "5A2B1C",但我必须按照顺序进行计数。

这是我正在做的代码:

string
|> String.graphemes
|> Enum.reduce([], fn(letter, acc) -> Keyword.update(acc, letter, 1, &(&1 + 1)) end)

但是,在我的测试中,我正在尝试生成一个列表,如下所示 ["AAA", "BB", "AA", "C"],这样我就可以轻松计数与String.lenght

看起来像使用 Enum.chunk_by 我越来越接近解决方案。

有没有办法实现这个?

最佳答案

如果您使用递归方法实现此目的,您可以轻松跟踪最后出现的字符及其当前计数,以及保存到目前为止结果的累加器。如果当前字符等于最后一个字符,则只需增加计数即可。如果两者不同,则将最后一个字符及其计数添加到累加器中,然后继续处理下一个字符,直到字符串为空。最后,对最终值进行编码并返回结果。

defmodule RunLengthEncoding do
# public interface, take first char and remember it as the current value
def encode(<<char::utf8, rest::binary>>) do
do_encode(rest, char, 1, "")
end

# current == last, increase the count and proceed
defp do_encode(<<char::utf8, rest::binary>>, char, count, acc) do
do_encode(rest, char, count + 1, acc)
end

# current != last, reset count, encode previous values and proceed
defp do_encode(<<char::utf8, rest::binary>>, last, count, acc) do
do_encode(rest, char, 1, acc <> to_string(count) <> <<last::utf8>>)
end

# input empty, encode final values and return
defp do_encode("", last, count, acc) do
acc <> to_string(count) <> <<last::utf8>>
end
end

关于elixir - 对 Elixir 中的重复字母进行分组或计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36392742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com