使用if子句在ruby中重复数字

时间:2014-09-22 12:11:45

标签: ruby

我写了一段代码,当传递给这个方法的数字中有一个重复的数字时,返回false

no_repeat(2114567) #=> false

以下是代码。我找不到它有什么问题。有任何建议要改善这一点。

def no_repeat(x)
    x = x.to_s.split('')
    i = 0
    while i < x.length
        if x[i].to_s == x[i + 1]
            false
        end 
        i += 1
    end
    true
end

no_repeat(2114567) #=> true

3 个答案:

答案 0 :(得分:6)

false除非是函数的最后一个表达式,否则不返回函数;明确地返回它。

def no_repeat(x)
    x = x.to_s.split('')
    i = 0
    while i < x.length
        if x[i].to_s == x[i + 1]
            return false # <--------
        end 
        i += 1
    end
    true
end

no_repeat(2114567)  # => false
no_repeat(1234)     # => true

&#39; 12345&#39; .each_char.each_cons(2).ANY? {| x,y | x == y} 假 &#39; 11345&#39; .each_char.each_cons(2)。任何? {| x,y | x == y} 真

使用正则表达式(捕获组,反向引用)的替代方法:

def no_repeat(x)
  ! (/(.)\1/ === x.to_s)
end

p11y使用each_cons建议的另一种替代方法:

'12345'.each_char.each_cons(2).none? { |x, y| x == y }
# => true
'11345'.each_char.each_cons(2).none? { |x, y| x == y }
# => false

'12345'.each_char.each_cons(2).all? { |x, y| x != y }
# => true
'11345'.each_char.each_cons(2).all? { |x, y| x != y }
# => false

答案 1 :(得分:1)

def no_repeat(n)
  s = n.to_s
  s.size == s.squeeze.size
end

no_repeat(2114567)  #=> false
no_repeat(-2114567) #=> false
no_repeat(2141567)  #=> true

我建议您更改方法,以便在有重复数字时返回true,并将其重命名为repeated_digits?

答案 2 :(得分:0)

如果您想知道某个数字中的数字是否显示多次

x.to_s.chars - x.to_s.chars.uniq == 0

如果您想知道某个数字是否连续显示在某个数字中,您可以试试这个

x.to_s.chars.each_cons(2).to_a.count{|array|array.uniq.length == 1} > 0