我的&& amp;有什么问题运营商?

时间:2014-10-13 02:35:44

标签: ruby-on-rails ruby

我想知道输入false时输出1982的原因。我的&&声明有问题吗?我尝试使用!(t==r),但它没有用;由于某种原因,它不断输出false

  def no_repeats?(year)
   out=true
   t=0
   while t<4
     r=0
     while r<4
       if (year[t] == year[r]) && t != r
         out=false
       end
         r+=1

      end
      t+=1
   end

   out
  end

1 个答案:

答案 0 :(得分:2)

你可能会比这需要的更复杂一点。

2.2.0-preview1 :001 > load 'no_repeat.rb'
 => true

作为字符串进行测试

2.2.0-preview1 :002 > no_repeats?("1981")
 => false
2.2.0-preview1 :003 > no_repeats?("1983")
 => true

测试为整数

2.2.0-preview1 :004 > no_repeats?(1981)
 => false
2.2.0-preview1 :005 > no_repeats?(1983)
 => true

no_repeat.rb看起来像

  def no_repeats?(year)
    digits = year.to_s.split(//)
    digits.size == digits.uniq.size
  end

编辑:基准

Using Original Post

real    0m0.598s
user    0m0.583s
sys     0m0.015s



Using .split(//)

real    0m1.322s
user    0m1.321s
sys     0m0.000s



Using .chars.to_a

real    0m0.562s
user    0m0.557s
sys     0m0.004s

所以,为了使这个更完整的答案,我已经包括了我的基准测试,每个测试使用400,000次方法。使用split(//),您将获得近2倍的性能提升。通过使用chars.to_a代替,您将获得原始速度。

def no_repeats?(year)
  digits = year.to_s.chars.to_a
  digits.size == digits.uniq.size
end