C#:目标数不在列表时,查找其邻近上下数值
解决方法:查找目标数的上下邻近值
没问题,我来帮你实现这个查找逻辑。咱们先明确需求:当目标数不在double类型的列表中时,需要找出比目标数大的最小数值(下一个最高值)和比目标数小的最大数值(下一个最低值)。如果目标数在列表里,你可以根据需求选择返回目标本身作为上下值,或者做其他处理。
方法一:遍历法(简单直观)
这种方法适合列表规模不大的场景,逻辑清晰易懂:
double target = 5; List<double> list = new List<double>() { 1, 2, 3, 7, 8, 9 }; // 如果原列表是无序的,先排序(升序) list.Sort(); double? lower = null; double? higher = null; foreach (var num in list) { if (num < target) { // 每次更新为比target小的更大值 lower = num; } else if (num > target) { // 升序列表中第一个比target大的就是最小的那个,找到后直接跳出循环 higher = num; break; } else { // 目标数在列表中的情况,这里返回自身作为上下值 lower = num; higher = num; break; } } // 输出结果:double higher = 7; double lower = 3; Console.WriteLine($"double higher = {higher}; double lower = {lower};");
方法二:二分查找法(高效优化)
如果你的列表规模很大,用二分查找能把时间复杂度从O(N)降到O(logN),性能提升明显:
double target = 5; List<double> list = new List<double>() { 1, 2, 3, 7, 8, 9 }; // 确保列表是升序排序的 list.Sort(); int searchResult = list.BinarySearch(target); double? lower = null; double? higher = null; if (searchResult >= 0) { // 目标数存在于列表中 lower = list[searchResult]; higher = list[searchResult]; } else { // BinarySearch返回负数时,~searchResult得到第一个比target大的元素的插入位置 int insertionPoint = ~searchResult; // 插入点大于0,说明存在比target小的元素 if (insertionPoint > 0) { lower = list[insertionPoint - 1]; } // 插入点小于列表长度,说明存在比target大的元素 if (insertionPoint < list.Count) { higher = list[insertionPoint]; } } // 输出结果:double higher = 7; double lower = 3; Console.WriteLine($"double higher = {higher}; double lower = {lower};");
边界情况处理
别忘了考虑这些特殊场景:
- 目标数比列表中所有元素都小:
lower为null,higher是列表第一个元素 - 目标数比列表中所有元素都大:
higher为null,lower是列表最后一个元素 - 列表为空:
lower和higher都为null,建议添加判断抛出异常或返回默认值
内容的提问来源于stack exchange,提问作者Stavros
相关产品推荐
相关产品推荐

