Как найти самые длинные последовательные цифры? - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь найти самые длинные последовательные цифры из цепочки цифр.Например, учитывая:

"12233344445"

Я ожидаю возврата:

"4444"

Я могу найти это с помощью итерации, но я думаю, что использование регулярных выражений было бы здорово, хотя и неэффективно.Это должно быть просто, но я не могу этого сделать.Пожалуйста, просветите меня.Я использую Ruby, но подойдет любой язык.

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Другой вариант - преобразовать строку в массив и использовать Enuberable chunk_ Между тем для него:

num.each_char.chunk_while {|i, j| j == i }.to_a
#=> [["1"], ["2", "2"], ["3", "3", "3"], ["4", "4", "4", "4"], ["5"]]

Таким образом, вы можете получить, например:

num.each_char.chunk_while {|i, j| j == i }.map(&:join) #=> ["1", "22", "333", "4444", "5"]

Или просто получить самую длинную строку, например, так:

num.each_char.chunk_while {|i, j| j == i }.max_by(&:length).join() #=> "4444"
0 голосов
/ 26 сентября 2018

Вы можете использовать сканер, чтобы найти все совпадения, а затем сгладить, чтобы найти самое длинное совпадение:

> "12233344445".scan(/((\d)\2*)/).flatten.max_by(&:length)
=> "4444"
0 голосов
/ 26 сентября 2018

Независимо от того, какое регулярное выражение вы используете, потребуется дальнейшая итерация.Вот один из способов.

str = "12233344445"

str.gsub(/(\d)\1*/).max_by(&:size)
  #=> "4444"

У нас есть

enum = str.gsub(/(\d)\1*/)
  #=> #<Enumerator: "12233344445":gsub(/(\d)\1*/)>

. Мы можем преобразовать это в массив, чтобы увидеть элементы, которые будут генерироваться этим перечислителем.

enum.to_a
  #=> ["1", "22", "333", "4444", "5"]

Регулярное выражение гласит: «Совпадение цифры в группе захвата 1, за которой следуют ноль или более символов, равных содержанию группы захвата 1».

Используется форма String # gsub где блок не указан.(Здесь метод не имеет ничего общего с заменой символов, что может немного сбивать с толку.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...