我想知道输入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
答案 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