首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在灵丹妙药中对重复字母进行分组或计数

在灵丹妙药中对重复字母进行分组或计数
EN

Stack Overflow用户
提问于 2016-04-03 23:55:29
回答 3查看 3.1K关注 0票数 3

我在试着用药剂数字符串上的复写字母。我确实尝试过一些尝试,但直到现在都没有成功。

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

所需的输出将是"3A2B2A1C"

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

这就是我正在做的代码:

代码语言:javascript
运行
复制
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,我越来越接近一个解决方案。

有办法制造这个吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-04 05:47:35

如果使用递归方法实现这一点,则可以很容易地跟踪上次发生的字符及其当前计数,以及到目前为止保存结果的累加器。如果当前字符等于最后一个字符,则只需增加计数。如果两者不同,则将最后一个字符及其计数添加到累加器中,然后继续进行下一个字符,直到字符串为空。最后,对最终值进行编码并返回结果。

代码语言:javascript
运行
复制
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
票数 6
EN

Stack Overflow用户

发布于 2016-04-04 11:50:32

根据Help Center > Answering的说法,我确实解决了这个问题:

代码语言:javascript
运行
复制
string
|> String.graphemes
|> Enum.chunk_by(fn arg -> arg end)
|> Enum.map(fn arg -> to_string(arg) end)
|> Enum.reduce("", fn(arg, acc) -> acc <> to_string(String.length(arg)) <> String.first(arg) end)

现在,解释如下:

String.graphemesstring转换为包含每个字母的List

代码语言:javascript
运行
复制
["A", "A", "A", "B", "B", "A", "A", "C"]

Enum.chunk_by(fn arg -> arg end)将每个重复的字母分组到新的列表中:

代码语言:javascript
运行
复制
[["A", "A", "A"], ["B", "B"], ["A", "A"], ["C"]]

Enum.map(fn arg -> to_string(arg) end)再次将其结合在一起:

代码语言:javascript
运行
复制
["AAA", "BB", "AA", "C"]

Enum.reduce("", fn(arg, acc) -> acc <> to_string(String.length(arg)) <> String.first(arg) end)最后将计数(String.length)和第一个字母(String.first)连接到初始化所有累加器(""):

代码语言:javascript
运行
复制
"3A2B2A1C"
票数 3
EN

Stack Overflow用户

发布于 2020-08-06 08:58:22

你也可以在下面这样做

代码语言:javascript
运行
复制
"AAABBAAC" 
|> String.graphemes 
|> Enum.chunk_by(fn x -> x end) 
|> Enum.map(fn x -> [Enum.at(x,0), Enum.count(x)] end) 
|> List.flatten 
|> Enum.join
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36392742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档