我一直在讨论一些编码面试问题。我想知道实现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)运行时。
感谢您对此的解释。谢谢。
答案 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)
,n
为str
中的字符数。
复杂性不可能更好,因为整个字符串需要至少解析一次才能找到元音。但是,可能会有更快的实现。
答案 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