这实际上是我发现的一个技术面试问题。
给定一个数组,找到彼此最接近的两个整数元素。如果有多个[具有相同差异的对],则返回最小的对。
我开了一枪。如你所见,它看起来很难看。我想知道替代的,更清洁和更有效的方法。如果有不止一个,我没有做关于返回最小对的问题的最后一部分,但是它会起作用。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]
答案 0 :(得分:2)
这个问题是1维的好处是,当数组被排序时,最接近的元素保证是相邻的。所以我采取这种方法:
答案 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
希望它可以解决您的问题。