假设我在0到100之间有一组10个随机数。
操作员还给我一个0到100之间的随机数。 然后我得到了集合中与操作员给我的数字最接近的数字。
set = {1,10,34,39,69,89,94,96,98,100}
运营商编号= 45
return = 39
如何将其转换为代码? (javascript或其他)
答案 0 :(得分:7)
如果set是有序的,则进行二分查找以找到最接近的值(或2个值)。然后区分哪两个最接近...减去?
如果set没有被排序,只需遍历集合,(排序它本身需要多次传递),并且对于每个成员,检查差异是否小于您到目前为止看到的最小差异,如果是,则将其记录为新的最小差异,并将该数字记录为新的候选答案。 。
public int FindClosest(int targetVal, int[] set)
{
int dif = 100, cand = 0;
foreach(int x in set)
if (Math.Abs(x-targetVal) < dif)
{
dif = Math.Abs(x-targetVal);
cand = x;
}
return cand;
}
答案 1 :(得分:5)
input
的数组,创建另一个大小相同的数组Math.abs(input[i] - operatorNumber)
k
)input[k]
<强> NB 强>
function closestTo(number, set) {
var closest = set[0];
var prev = Math.abs(set[0] - number);
for (var i = 1; i < set.length; i++) {
var diff = Math.abs(set[i] - number);
if (diff < prev) {
prev = diff;
closest = set[i];
}
}
return closest;
}
答案 2 :(得分:1)
这个怎么样:
1)将集合放入二叉树中 2)将操作员编号插入树中 3)返回运算符父级
答案 3 :(得分:1)
答案 4 :(得分:1)
有人在Mathematica上标记了这个问题,所以这是一个Mathematica答案:
set = {1,10,34,39,69,89,94,96,98,100};
opno = 45;
set[[Flatten[
Position[set - opno, i_ /; Abs[i] == Min[Abs[set - opno]]]]]]
当有多个元素的元素与运算符编号相等时,它可以工作。
答案 5 :(得分:0)
python示例:
#!/usr/bin/env python
import random
from operator import itemgetter
sample = random.sample(range(100), 10)
pivot = random.randint(0, 100)
print 'sample: ', sample
print 'pivot:', pivot
print 'closest:', sample[
sorted(
map(lambda i, e: (i, abs(e - pivot)), range(10), sample),
key=itemgetter(1)
)[1][0]]
# sample: [61, 2, 3, 85, 15, 18, 19, 8, 66, 4]
# pivot: 51
# closest: 66