Assuming that you're talking about an array of numbers, the easiest is to use the portions of ruby that are coded in C (MRI) or Java (Jruby). Lets say that we have a list of weights, and counterfeit money weighs less than 5, and real money weighs 5. There are a number of different approaches to split out the contents of the array efficiently:
moneys = Array.new(100) { rand(5) + 1 }
# This now contains all the counterfeit money:
counterfeits = moneys - [5]
# If we're not able to use direct equality, then we can just use a plain old delete_if, sending a message to the money (forgive the equality message here, imagine it's something else)
real = 5
counterfeits = moneys.delete_if { |m| m.==(real) }
# In some cases you want to first reduce the workload for delete_if, although this would often be preoptimization:
moneys.compact.delete_if { |m| m == real }
# So, for many (but definately by no means all workloads) the most efficient method to do this might be:
counterfeits = moneys.compact! - [5]
This keeps what are (under MRI at least) the number of dynamic method dispatches and temporary objects and/or block invocations to a minimum. Using compact when memory bound (for large sets) and/or using self mutating methods (Enumerable#!) also helps avoid excess GC load.
Finally, I just have to say, that asking about micro-optimizations without good context (size of input at the very least) is an awful interview question, unless the expected answer is a question about context and constraints.