Проверка скорости написания сценариев для форматирования строки - PullRequest
0 голосов
/ 22 января 2019

Я форматирую номер телефона, и после тире не может быть ни одной цифры, т.е. 123-555-5555 или 12-34, но не 123-4.В ответе также могут присутствовать любые буквенные символы.

Здесь - мой ответ.

class CodeTestException < Exception; end

# driver method
def phone_format(s)
  string = s.to_s.gsub(/[^0-9]/, '') # force input to string
  string_length = string.length

  # ensure that the return type stays consistent and make sure that there isn't
  # one digit by itself as specified by the API
  return string unless string_length > 2

  format_phone_string(string, string_length)
end

private

def format_phone_string(string, string_length)
  formatted_string = ""
  early_dash = string_length % 3 == 1
  skip_dash = false

  # start index at 1 for easier comprehension
  i = 0

  string.each_char do |char|
    formatted_string << char
    break if i == string_length

    i += 1

    formatted_string << '-' && skip_dash = true if early_dash && (i == string_length - 2)

    formatted_string << '-' if i % 3 == 0 && !skip_dash
  end

  formatted_string
end

raise CodeTestException unless phone_format("(+1) 888 33x19") == "188-833-19"
raise CodeTestException unless phone_format("555 123 1234") == "555-123-12-34"
raise CodeTestException unless phone_format("(+1)") == '1'
raise CodeTestException unless phone_format(nil) == ""
raise CodeTestException unless phone_format("") == ""

Мне сказали, что ответ не является рекурсией или сканированием.Я считаю, что O(n) - лучшее время, которое я могу сделать.Некоторые другие решения, которые я обнаружил, были кратны линейному времени.Может кто-нибудь победить мое решение?

...