5、10、25、33、22、8、11 という数字で構成される配列があるとArrL
します。私の関数は 21 という数字を取り、「21 より大きく、21 に最も近い」数字を見つけます。この場合は 22 になります。
4 に答える
比較リストはソートされていないため、その中のすべての要素をチェックする必要があります。ソートされたリストは、バイナリ検索を使用するとより効率的に実行できますが、リストには当てはまりません。
アイデアは、リストを調べながら最も近いが大きい番号の記録を保持し、より良い番号(現在保存されている番号よりも大きいが近い)が見つかった場所で更新することです。これは、次のような説明的なプロセスです。
リスト内のすべての番号
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
あなたはこの方法で行くことができます
// 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);
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;
}
}
配列を反復処理し、数値と位置に最も近いものを格納します。近い場合は、これらの値を更新します。