这是问题提示:
编写一个带字符串的方法,如果是这个字母则返回
true
在"z"
之后,"a"
出现在三个字母内。你可以假设 字符串只包含小写字母。
我尝试使用三元运算符,并希望包含match
或count
方法。关于如何找到"a"
和"z"
之间的字符数或解决此问题的最简单方法的任何想法?
def nearby_az(string)
string.count <= 3 ? true : false
end
答案 0 :(得分:7)
正则表达式是解决这个问题的好方法。
您可以使用online regex testers来试验不同的正则表达式,输入和输出。
我想到的第一个解决方案是为每个可能的正确输入提出一个模式:
这意味着:
然后将它们与'或'运算符(|)
组合这意味着匹配所有这三个条件。
A link to this example is here
这样做有点冗长,所以可以通过更紧凑的方式表达它来改进:
这意味着:
A link to this example is here
您在名为match的ruby字符串上使用该方法,该字符串接收正则表达式对象,然后检查布尔返回值。
编辑:
ruby代码看起来像这样:
def nearby_az(string)
return string.match(/a[a-z]{0,2}z/) != nil
end
string.match()返回一个对象,您可以查询该对象以获取有关匹配的信息。如果没有匹配,string.match()将返回nil。
答案 1 :(得分:5)
!!("fjeioaeiz" =~ /a.{,2}z/) #=> true
!!("fjeioaz" =~ /a.{,2}z/) #=> true
!!("fjeioasbdz" =~ /a.{,2}z/) #=> false
答案 2 :(得分:1)
看,马!没有正则表达式!
def a_upto_4_z(str)
str.each_char.with_index.any? { |c,i| c == ?a && str[i+1,3].include?(?z) }
end
a_upto_4_z "rvaxxzo" #=> true
a_upto_4_z "rvaxxxzo" #=> false
a_upto_4_z "rvaxzo" #=> true
a_upto_4_z "rvazo" #=> true
a_upto_4_z "rvzao" #=> false
编辑:@Stefan提出了一个很好的观点。让我们这样做:
def mind_the_gap(str, max_gap=2)
gap = max_gap + 1 # or larger
str.each_char do |c|
case c
when ?z
return true if gap <= max_gap
when ?a
gap = 0
else
gap += 1
end
end
false
end
mind_the_gap "rvaxxzo" #=> true
mind_the_gap "rvaxxxzo" #=> false
mind_the_gap "rvaxzo" #=> true
mind_the_gap "rvazo" #=> true
mind_the_gap "rvzao" #=> false
请注意,gap
和c == ?z
时无需增加gap > max_gap
。