为ordered_vowel_words实现一个方法

时间:2017-01-29 08:56:10

标签: ruby algorithm

我一直在讨论一些编码面试问题。我想知道实现ordered_vowel单词方法。我正在研究算法问题以实现此方法以用于理解算法。我有以下内容:

此方法采用一串小写单词并返回一个字符串,其中只包含按字母顺序排列所有元音(不包括“y”)的单词。元音可能会重复("afoot"是一个有序的元音词)

def ordered_vowel_words(str)
  words = str.split(" ")

  ordered_vowel_words = words.select do |word|
    ordered_vowel_word?(word)
  end

  ordered_vowel_words.join(" ")
end

def ordered_vowel_word?(word)
  vowels = ["a", "e", "i", "o", "u"]

  letters_arr = word.split("")
  vowels_arr = letters_arr.select { |l| vowels.include?(l) }

  (0...(vowels_arr.length - 1)).all? do |i|
    vowels_arr[i] <= vowels_arr[i + 1]
  end
end

我添加了以下测试用例:

puts("\nTests for #ordered_vowel_words")
puts("===============================================")
    puts "ordered_vowel_words(\"amends\") == \"amends\": "  + (ordered_vowel_words("amends") == "amends").to_s
    puts "ordered_vowel_words(\"complicated\") == \"\": "  + (ordered_vowel_words("complicated") == "").to_s
    puts "ordered_vowel_words(\"afoot\") == \"afoot\": "  + (ordered_vowel_words("afoot") == "afoot").to_s
    puts "ordered_vowel_words(\"ham\") == \"ham\": "  + (ordered_vowel_words("ham") == "ham").to_s
    puts "ordered_vowel_words(\"crypt\") == \"crypt\": "  + (ordered_vowel_words("crypt") == "crypt").to_s
    puts "ordered_vowel_words(\"o\") == \"o\": "  + (ordered_vowel_words("o") == "o").to_s
    puts "ordered_vowel_words(\"tamely\") == \"tamely\": "  + (ordered_vowel_words("tamely") == "tamely").to_s

这个运行时分析是什么?

为什么我们可以为mm函数调用获得O(m)O(m)运行时。

感谢您对此的解释。谢谢。

2 个答案:

答案 0 :(得分:5)

这种方法很简短,应该可以理解:

def ordered_vowel_words(str)
  str.split(" ").select{|w| ordered_vowel_word?(w) }.join(" ")
end

def ordered_vowel_word?(word)
  vowels = word.scan(/[aeiou]/)
  vowels == vowels.sort
end

对数组进行排序可能效率不高,只是为了检查它已经排序,所以这里有一个替代方案:

def ordered_vowel_word?(word)
  word.scan(/[aeiou]/).each_cons(2).all?{ |vowel1, vowel2| vowel1 <= vowel2 }
end

使用此方法,整体复杂度应为O(n)nstr中的字符数。

复杂性不可能更好,因为整个字符串需要至少解析一次才能找到元音。但是,可能会有更快的实现。

答案 1 :(得分:0)

您似乎只是使用App Academy为此问题提供的解决方案。在准备这些面试问题时,重要的是你要尝试自己解决这些问题 - 他们不会问你这些确切的问题,而是相同逻辑的变化(分解数据结构,对它们应用一些方法,比较结果或根据输入建立新的回复。)

因此,如果您认真申请,请不要查看解决方案。我也建议找一个导师。

现在,问你的问题。

require 'benchmark'

def ordered_vowel_words(str)
  words = str.split(" ")

  ordered_vowel_words = words.select do |word|
    ordered_vowel_word?(word)
  end

  ordered_vowel_words.join(" ")
end

def ordered_vowel_word?(word)
  vowels = ["a", "e", "i", "o", "u"]

  letters_arr = word.split("")
  vowels_arr = letters_arr.select { |l| vowels.include?(l) }

  (0...(vowels_arr.length - 1)).all? do |i|
    vowels_arr[i] <= vowels_arr[i + 1]
  end
end

puts Benchmark.measure {ordered_vowel_words("amends")}
puts Benchmark.measure {ordered_vowel_words("complicated")}
puts Benchmark.measure {ordered_vowel_words("afoot")}
puts Benchmark.measure {ordered_vowel_words("ham")}
puts Benchmark.measure {ordered_vowel_words("crypt")}
puts Benchmark.measure {ordered_vowel_words("o")}
puts Benchmark.measure {ordered_vowel_words("tamely")}

请参阅此处了解一些简单的基准测试工具:https://ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html