コミック:辞書の順序アルゴリズムとは何ですか?
上の「プログラマーシャオフイ」をクリックし、「トップオフィシャルアカウント」を選択してください。
興味深く有意義な記事がお早めに配信されます!
- - - 次の日 - - -
アルゴリズムのトピック:
正の整数が与えられた場合、それ自体より大きい整数に最も近い「転置番号」を見つけるメソッドを実装します。
転置とは何ですか?整数のすべての桁を並べて、新しい整数を取得することです。たとえば、53241と23541です。
Xiao Huiは、この種の転置された整数の呼び方を知らないので、「転置された番号」と呼びましょう。
タイトルには、それ自体よりも大きい最も近い転置を見つけるためのメソッドを作成する必要があります。例えば:
12345と入力し、12354を返し、12354と
入力し、12435を返し、12435と
入力し、12453を返します。
Xiao Huiによって発見された「ルール」:
12345と入力し、12354を返します
。12354-12345= 9
は正確に9の累乗です。
12354と入力し、12435
12435-12354 = 81を返します。これ
は正確に9の2乗です。
したがって、最も近い転置を計算するたびに、N乗に9を追加するだけで済みますか?
————————————
栗を与える:
番号1、2、3、4、および5が与えられます。
最大の組み合わせ:54321
最小の組み合わせ:12345
たとえば、整数12354が与えられた場合、それに最も近く、それより大きい転置を見つける方法は?
元の数値に近づけるには、高次を変更せず、低次を最小範囲内で変更する必要があります。
では、何ビットを変換する必要がありますか?これは、現在の整数の逆順の領域に依存します。
示されている場合、12354の逆順の領域は最後の2桁です。これらの2桁の現在の最大の組み合わせを見てください。元の番号に最も近く、元の番号より大きくしたい場合は、3番目から最後に変更する必要があります。
それを変更する方法は?12345の最後の3桁は3です。逆順の領域から、3より大きい数を見つけて、位置を3と入れ替える必要があります。
スワップ後の一時的な結果は12453で、最後の3桁が決定されています。現時点では、最後の2桁は逆の順序のままです。最後から3番目の桁の値が4の場合、最後の2桁ができるだけ小さくなるように、最後の2桁を元に戻す必要があります。
このようにして、望ましい結果12435が得られます。
//主流程,返回最近一个大于自身的相同数字组成的整数。
public static int[] findNearestNumber(int[] numbers){
//拷贝入参,避免直接修改入参
int[] numbersCopy = Arrays.copyOf(numbers, numbers.length);
//1.从后向前查看逆序区域,找到逆序区域的前一位,也就是数字置换的边界
int index = findTransferPoint(numbersCopy);
//如果数字置换边界是0,说明整个数组已经逆序,无法得到更大的相同数字组成的整数,返回自身
if(index == 0){
return null;
}
//2.把逆序区域的前一位和逆序区域中刚刚大于它的数字交换位置
exchangeHead(numbersCopy, index);
//3.把原来的逆序区域转为顺序
reverse(numbersCopy, index);
return numbersCopy;
}
private static int findTransferPoint(int[] numbers){
for(int i=numbers.length-1; i>0; i--){
if(numbers[i] > numbers[i-1]){
return i;
}
}
return 0;
}
private static int[] exchangeHead(int[] numbers, int index){
int head = numbers[index-1];
for(int i=numbers.length-1; i>0; i--){
if(head < numbers[i]){
numbers[index-1] = numbers[i];
numbers[i] = head;
break;
}
}
return numbers;
}
private static int[] reverse(int[] num, int index){
for(int i=index,j=num.length-1; i<j; i++,j--){
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
return num;
}
public static void main(String[] args) {
int[] numbers = {1,2,3,4,5};
for(int i=0; i<10;i++){
numbers = findNearestNumber(numbers);
outputNumbers(numbers);
}
}
//输出数组
privte static void outputNumbers(int[] numbers){
for(int i : numbers){
System.out.print(i);
}
System.out.println();
最も近い転置を取得するための3つのステップ:
1.逆順領域を後ろから前に見て、番号置換の境界である逆順領域の前のビットを見つけます
。2 。逆順領域の前のビットを逆順領域のそれより少し大きい番号と交換します。3。
元の順序を逆にします。シーケンスする領域
このソリューションには、辞書順序アルゴリズムという大きな名前があります。
いくつかの追加:
このコミックは純粋に娯楽です。現在の作品をできるだけ大切にし、シャオフイの振る舞いを真似しないでください。
- - -終わり - - -
この記事が気に入った友達は、写真を長押ししてサブスクリプションアカウントプログラマーのXiaohuiをフォローし、よりエキサイティングなコンテンツをご覧ください。