假设我有一个名为的数组ArrL
,它由数字 5、10、25、33、22、8 和 11 组成。我的函数将采用数字 21 并找到“大于 21 且最接近 21”的数字,其中这个案例是22。我该怎么做?
问问题
3708 次
4 回答
1
因为您的比较列表没有排序,所以您必须检查其中的每个元素。使用二进制搜索可以更有效地完成排序列表,但您的列表并非如此。
这个想法是在您浏览列表时记录最接近但更大的数字,并在找到更好的地方更新它(仍然比当前保存的更大但更接近),类似于以下描述性过程:
对于列表中的每个数字
N
,请执行以下步骤 2 到 5(含)。如果您没有数字,请转到第 6 步。如果
N
小于或等于您的目标数,请转到第 5 步。没有意义。如果
R
尚未设置(这N
是您发现的第一个大于目标的数字),则保存N
为返回值R
,然后转到步骤 5。如果
N
小于R
,则替换R
为N
,因为它更接近。返回到第 1 步以获取下一个数字。
如果您
R
在上述步骤中设置了某些内容,那就是您想要的值。否则没有值高于您的目标数字。
下面的伪代码是另一种看待它的方式:
def greaterButClosest (list, find):
found = -1 # Initially none.
for idx = 0 to list.length: # Check all indexes.
if list[idx] > find: # Only consider those higher.
if found == -1: # First one automatically closest.
found = idx
else:
if list[idx] < list[found]: # Otherwise, closer if less than current.
found = idx
if found == -1: # Some sentinel if none found.
return -99999
return list[found] # Otherwise return it.
并且,作为概念证明,Python 代码:
def greaterButClosest (list, find):
found = -1
for idx in range (len(list)):
if list[idx] > find: # < for opposite case.
if found == -1:
found = idx
else:
if list[idx] < list[found]: # > for opposite case.
found = idx
# <- Note indent level, this is OUTSIDE the for loop.
if found == -1:
return -99999
return list[found]
for tst in [7, 8, 9, 10, 11, 99]:
print "%2d: %2d"%(tst, greaterButClosest ([5, 10, 25, 33, 22, 8, 11], tst))
输出:
7: 8
8: 10
9: 10
10: 11
11: 22
99: -99999
于 2013-02-11T08:45:09.070 回答
1
你可以这样走
// To find Closest Number
NavigableSet<Integer> values = new TreeSet<Integer>();
for (int x : listOfNum) { values.add(x); }
int lower = values.floor(number);
int higher = values.ceiling(number);
于 2016-03-18T06:21:50.477 回答
0
遍历数组,存储最接近的数字和位置。如果更接近更新这些值。
于 2013-02-11T08:41:01.417 回答
0
以下是您可以遵循的几个步骤, 1.按升序对数组进行排序 2.对数组执行线性搜索,以便显示大于所选数字的第一个数字并跳出循环。对于排序数组:
for(int i=0;i<ArrL.length;i++){
if(ArrL[i]>selected_no){
System.out.println("The closest greater number is'+ArrL[i]);
break;
}
}
于 2013-02-11T08:47:01.780 回答