在数值差异中找到彼此最接近的两个整数元素 - Ruby

时间:2015-09-23 04:21:48

标签: ruby

这实际上是我发现的一个技术面试问题。

给定一个数组,找到彼此最接近的两个整数元素。如果有多个[具有相同差异的对],则返回最小的对。

我开了一枪。如你所见,它看起来很难看。我想知道替代的,更清洁和更有效的方法。如果有不止一个,我没有做关于返回最小对的问题的最后一部分,但是它会起作用。

least_diff = 99999 #how to represent infinity?
ans_arr = []
for i in (0...arr.length)
    for k in (0...arr.length)
        if i != k 
            curr_diff = (arr[i] - arr[k]).abs
            if curr_diff < least_diff
                if ans_arr != nil
                    ans_arr.pop
                end
                least_diff = curr_diff
                ans_arr.push("\(#{arr[i]},#{arr[k]}\)")
            end
        end
    end
end

ans_arr[0]

3 个答案:

答案 0 :(得分:2)

这个问题是1维的好处是,当数组被排序时,最接近的元素保证是相邻的。所以我采取这种方法:

  1. 对数组进行排序。
  2. 线性扫描阵列,计算每个相邻元素之间的差异。
  3. 记录每一步的最小差异 - 在列表末尾,这是最终答案。

答案 1 :(得分:2)

a = [3, -43, 1, 98, 29, 8, 10, -66]

a.sort.each_cons(2).min_by{|x, y| y - x}
# => [1, 3]

答案 2 :(得分:1)

我不知道Ruby!但我肯定可以帮助解决逻辑问题。

  

关于你的问题的答案,

     

如何设置 least_diff 无穷大?

- &GT;如果它不是无限的那么它也会起作用,但为此你必须找到你可以存储在 least_diff 中的最大数量,并将该值分配给 least_diff

- &GT;如果if curr_diff < least_diff不正确呢?你必须有另一部分来检查if curr_diff == least_diff&amp; else部分。 (即没有条件匹配!)

  

要回答问题的第二部分,

- &GT;您可以通过检查对的总和来检查最小的对。

例如,

假设你的答案中有对,(5,6),(3,4)和(4,8)。现在根据问题,你必须从上面的对中找到(3,4)。

(4 + 8 = 12)> (5 + 6 = 11)&gt; (3 + 4 = 7),所以最小和'7'是你的答案。

因此,您可以在代码中添加以下逻辑。

least_pair_sum = 9999 #Assign the maximum value as I mentioned above.
#in the if part
if curr_diff <= least_diff
      if ans_arr != nil
           curr_pair_sum = arr[i] + arr[k]  #Don't know the syntax! Just see the logic
           if curr_pair_sum <= least_pair_sum
                ans_arr.push("\(#{arr[i]},#{arr[k]}\)") 
           end
      end
      least_diff = curr_diff
      #Removed ans_arr.push("\(#{arr[i]},#{arr[k]}\)") so you have only answer in the array
end

希望它可以解决您的问题。