我试图在1到1000000之间的字符串数组中找到重复值。
但是,根据我的代码,我得到输出为所有加倍的条目。
例如,如果我有[1,2,3,4,3,4]
,它会给出3 4 3 4而不是3 4的输出。
这是我的代码:
array = [gets]
if array.uniq.length == array.length
puts "array does not contain duplicates"
else
puts "array does contain duplicates"
print array.select{ |x| array.count(x) > 1}
end
此外,每次我测试代码时,都必须将数组定义为array = [1,2,3,4,5,3,5]
。 puts
有效,但在使用array [gets]时不会打印。
有人可以帮我解决这两个问题吗?
答案 0 :(得分:3)
Array#difference
又来了救援。 (我承认@ user123的答案更直接,除非你假装Array#difference
已经是一个内置方法。Array#difference
可能是两者中效率更高的,因为它避免了count
的重复调用{1}}。)有关方法的说明及其使用的链接,请参阅我的回答here。
简而言之,它与Array#-不同,如以下示例所示:
a = [1,2,3,4,3,2,4,2]
b = [2,3,4,4,4]
a - b #=> [1]
a.difference b #=> [1, 3, 2, 2]
有一天,我希望将其视为内置。
对于目前的问题,如果:
arr = [1,2,3,4,3,4]
重复元素由:
给出arr.difference(arr.uniq).uniq
#=> [3, 4]
答案 1 :(得分:2)
对于您的第一个问题,您需要uniq
功能
array.select{ |x| array.count(x) > 1}.uniq
对于您的第二个问题,当您使用array = [gets]
收到值时,它会将整个数组序列作为单个字符串接收,因此所有内容都会存储在a[0]
["1, 2 3 4\n"]
中
答案 2 :(得分:1)
puts "Enter array"
array = gets.chomp.split(",").map(&:to_i)
if array.uniq.length == array.length
puts "array does not contain duplicates"
else
puts "array does contain duplicates"
print array.select{ |x| array.count(x) > 1}.uniq
end
将此代码复制到ruby文件中并尝试使用
运行ruby file_name.rb
答案 3 :(得分:0)
来到你的“获取”问题,
当你做一个获取时,你基本上得到一个字符串作为输入而不是一个数组。
2.2.0 :001 > array = [gets]
1,2,1,4,1,2,3
=> ["1,2,1,4,1,2,3\n"]
请参阅上面的示例,ruby解释器如何将所有元素作为单个字符串,并将其作为单个数组元素放入数组中。因此,您需要使用逗号作为分隔符将输入显式转换为数组。以下内容将解决您的问题。
array = gets.chomp
array = array.split(',').map(&:to_i)
if array.uniq.length == array.length
puts "array does not contain duplicates"
else
puts "array does contain duplicates"
print array.select{ |x| array.count(x) > 1}.uniq!
end