我正在进行面试蛋糕问题,他们在插入新值时进行了计算。我的直觉是将这种逻辑放在getter方法中,我希望能够对最佳实践有所了解。
他们的解决方案:
# Write a class TempTracker with these methods:
#
# insert()—records a new temperature
# getMax()—returns the highest temp we've seen so far
# getMin()—returns the lowest temp we've seen so far
# getMean()—returns the mean of all temps we've seen so far
# getMode()—returns a mode of all temps we've seen so far
class TempTracker
def initialize
# for mode
@occurrences = [0] * 111 # array of 0s at indices 0..110
@max_occurrences = 0
@mode = nil
# for mean
@total_numbers = 0
@total_sum = 0.0 # mean should be float
@mean = nil
# for min and max
@min_temp = nil
@max_temp = nil
end
def insert(temperature)
# for mode
@occurrences[temperature] += 1
if @occurrences[temperature] > @max_occurrences
@mode = temperature
@max_occurrences = @occurrences[temperature]
end
# for mean
@total_numbers += 1
@total_sum += temperature
@mean = @total_sum / @total_numbers
# for min and max
@max_temp = temperature if @max_temp.nil? || temperature > @max_temp
@min_temp = temperature if @min_temp.nil? || temperature < @min_temp
end
def get_max
@max_temp
end
def get_min
@min_temp
end
def get_mean
@mean
end
def get_mode
@mode
end
end
我最初写的插入和getter方法:
// ...
def insert(temp)
@max = temp if @max.nil? || @max < temp
@min = temp if @min.nil? || @min > temp
@total_sum += temp
@total_numbers += 1
@occurrences[temp] += 1
end
// ...
def get_mean
@total_sum / @total_numbers
end
def get_mode
@occurrences.each_with_index.max[1]
end
end
任何帮助理解是否/为什么在insert方法中使用计算逻辑会非常有用!
答案 0 :(得分:2)
插入是一种状态改变操作。在现场反映所有变化是有意义的。另一方面,获取不会改变状态,它只是读取它。
想象一下,你做了一次插入和一百次读取。对每次获取重复计算效率不高,因为自上次以来结果可能不会发生变化。浪费资源,但可以使代码更清晰。
我刚刚注意到我承担了阅读繁重的工作量。在写作繁重的工作量中,你写的比你读的更多,反之亦然。效率决定了你在吸气器中进行计算。没有人真正的回答,它总是一种权衡,是我想说的。