-2

假设我有一个名为的数组ArrL,它由数字 5、10、25、33、22、8 和 11 组成。我的函数将采用数字 21 并找到“大于 21 且最接近 21”的数字,其中这个案例是22。我该怎么做?

4

4 回答 4

1

因为您的比较列表没有排序,所以您必须检查其中的每个元素。使用二进制搜索可以更有效地完成排序列表,但您的列表并非如此。

这个想法是在您浏览列表时记录最接近但更大的数字,并在找到更好的地方更新它(仍然比当前保存的更大但更接近),类似于以下描述性过程:

  1. 对于列表中的每个数字N,请执行以下步骤 2 到 5(含)。如果您没有数字,请转到第 6 步。

  2. 如果N小于或等于您的目标数,请转到第 5 步。没有意义。

  3. 如果R尚未设置(这N是您发现的第一个大于目标的数字),则保存N为返回值R,然后转到步骤 5。

  4. 如果N小于R,则替换RN,因为它更接近。

  5. 返回到第 1 步以获取下一个数字。

  6. 如果您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 回答