-2

5、10、25、33、22、8、11 という数字で構成される配列があるとArrLします。私の関数は 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

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 に答える
0

配列を反復処理し、数値と位置に最も近いものを格納します。近い場合は、これらの値を更新します。

于 2013-02-11T08:41:01.417 に答える