【发布时间】:2014-04-25 05:54:05
【问题描述】:
我有一个随机的数字列表,例如 1、8、13、20、25、32、50、55、64、70,现在给定一个数字,例如 35,所需的较小值将是 32,较大的值将是 50。
我尝试这样做的方法是迭代所有值
var value = 35;
var list = new List<int> { 1, 8, 13, 20, 25, 32, 50, 55, 64, 70 };
var lesser = list.First();
var greater = list.Last();
foreach (var curr in list)
{
if (curr >= value)
{
greater = curr;
break;
}
lesser = curr;
}
Console.WriteLine("Lesser Value :{0}\tGreater Value:{1}", lesser, greater);
现在我问这个的原因是我需要针对列表生成一次然后多次请求值的情况进行优化。为每个请求迭代列表似乎是个坏主意。
更新
问题没有说明如果我们得到完全匹配需要什么,我需要上限和下限作为匹配的元素,即 32 应该返回 32 作为较小的值,32 作为较大的值以上列表。
反映相同的修改答案是:
int value = 32;
int[] list = new[] { 1, 8, 13, 20, 25, 32, 50, 55, 64, 70 };
int? floor = null;
int? ceil = null;
int index = Array.BinarySearch(list, value);
if (index >= 0) // element is found
{
floor = ceil =list[index] ;
}
else
{
index = ~index;
if (index == list.Length)
{
ceil = floor = list[index-1];
}
else
{
ceil = list[index];
floor = list[((index==0)?index: index-1)];
}
}
Console.WriteLine("floor = {0}", floor);
Console.WriteLine("ceil = {0}", ceil);
【问题讨论】:
-
您对快速排序更感兴趣,还是对可读代码更感兴趣?如果可读,@Ehsan 的答案就是要走的路。如果速度快,也许是 Ulugbek 的
-
@paqogomez Ehsan 的代码实际上会导致迭代发生两次,而不是像我的代码中那样发生一次。到目前为止,Ulugbek 的答案是最好的选择。