2016-11-20 37 views

回答

1

的一種方式,它是不漂亮,但工作原理:

def duplicates string 
    string.downcase.split('') 
       .group_by { |i| i } 
       .to_a 
       .select { |i| i[1].size > 1 } 
       .size 
end 

duplicates "abc"  #=> 0 
duplicates "abcdeaa" #=> 1 
duplicates "abcdeaB" #=> 2 

一個稍微好一點的實現:

def duplicates string 
    string.downcase.split('') 
       .group_by { |i| i } 
       .values 
       .select { |i| i.size > 1 } 
       .size 
end 
+0

測試通過,謝謝。 –

+0

@KirillZhuravlov用更好的版本更新了答案:) –

0

基於@ sagarpandya82回答

def duplicate_count(text) 
    text.downcase.chars.group_by(&:to_s).count { |v| v[1].count > 1 } 
end 
+1

考慮'text.downcase.each_char.group_by(&:本身).count {| _,v | v.count> 1}'。 [String.each_char](http://ruby-doc.org/core-2.3.0/String.html#method-i-each_char)返回一個枚舉器,避免需要'chars'返回的臨時數組。 [Object#本身](https://ruby-doc.org/core-2.2.0/Object.html#method-i-itself)比'to_s'更具表現力,但自從v2.2以來一直存在。我個人更喜歡'group_by {| s | s}'到'group_by(&:to_s)',我覺得有點太可愛了。 –

1
def count_dups(str) 
    str.each_char.with_object(Hash.new(0)) {|c,h| h[c.downcase] += 1}.count {|_,v| v >= 2} 
end 

count_dups "abc"  #=> 0 
count_dups "abcdeaa" #=> 1 
count_dups "abcdeaB" #=> 2 

Hash.new(0)通常被稱爲計數散列。請參閱Hash::new,特別是參考默認值(此處爲0)。

0
def dupe_count(text, data) 
    text.scan(data).count 
end 
dupe_count("abcc", "c") #<= 2 
dupe_count("test", "t") #<= 2 
dupe_count("lost", "w") #<= 0 

基本上你作爲參數給出的文本,跟你想在文本中算什麼一起,你再掃描你想找到與count

返回一個數字給定 data文本
相關問題