假设我有一组10个随机数字,这些数字的范围在0到100之间。
一个操作员还给了我一个0到100之间的随机数字。然后我需要找出这个数字集合中距离操作员给我的数字最近的数字。
例子
数字集合 = {1,10,34,39,69,89,94,96,98,100}
操作员给的数字 = 45
返回结果 = 39
如何将此转换为代码?(JavaScript或其他语言)
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;
}
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;
}
有人在这个问题上打了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]]]]]]
当集合中有多个元素与运算符号数字等距离时,它就能正常工作。
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
n
个数字,我们要在其中找到最接近的数字,并且我们要重复这个过程m
次。如果我们不排序,时间复杂度为O(mn)
。如果我们进行排序,则复杂度为O(n log n + m log n)
,因为排序是O(n log n)
,二分搜索是O(log n)
。如果m >> n
,则时间复杂度为O(m log n)
,优于O(mn)
。 - jason