Bande dessinée: Quel est l'algorithme d'ordre du dictionnaire?
Cliquez sur "Programmer Xiaohui" ci-dessus, et sélectionnez le "Top Official Account".
Des articles intéressants et significatifs seront livrés dès que possible!
----- le lendemain-----
Sujet de l'algorithme:
Étant donné un entier positif, implémentez une méthode pour trouver le "nombre de transposition" le plus proche de l'entier supérieur à lui-même.
Qu'est-ce que la transposition? Il s'agit d'arranger tous les chiffres d'un entier pour obtenir un nouvel entier. Par exemple, 53241 et 23541.
Xiao Hui ne sait pas comment appeler ce type d'entier transposé, appelons-le donc "nombre transposé".
Le titre nécessite d'écrire une méthode pour trouver la transposition la plus proche supérieure à elle-même. Par exemple:
Entrez 12345, retournez 12354,
saisissez 12354, retournez 12435,
saisissez 12435, retournez 12453
Les "règles" découvertes par Xiao Hui:
Entrez 12345 et renvoyez 12354
12354-12345 = 9
est exactement la puissance de 9
Entrez 12354 et renvoyez 12435
12435-12354 = 81 qui
est exactement le carré de 9
Ainsi, chaque fois que vous calculez la transposition la plus proche, il vous suffit d'ajouter 9 à la Nième puissance?
————————————
Donnez une châtaigne:
Étant donné les nombres 1, 2, 3, 4 et 5.
La plus grande combinaison: 54321 La
plus petite combinaison: 12345
Par exemple, étant donné l'entier 12354, comment trouver la transposition la plus proche et supérieure à elle?
Afin d'être proche du nombre d'origine, nous devons garder l'ordre supérieur inchangé et l'ordre inférieur pour changer l'ordre dans la plus petite plage.
Alors, combien de bits doivent être convertis? Cela dépend de la zone d'ordre inverse de l'entier actuel.
Si elle est affichée, la zone d'ordre inverse de 12354 correspond aux deux derniers chiffres, il suffit de regarder la combinaison maximale actuelle de ces deux chiffres. Si vous voulez être le plus proche du nombre d'origine et plus grand que le nombre d'origine, vous devez passer du troisième au dernier.
Comment le changer? Les 3 derniers chiffres de 12345 sont 3, nous devons trouver le nombre juste supérieur à 3 dans la zone d'ordre inverse et l'échanger avec la position 3:
Le résultat temporaire après l'échange est 12 453. Les trois derniers chiffres ont été déterminés. À ce stade, les deux derniers chiffres sont toujours dans l'ordre inverse. Nous devons reconvertir les deux derniers chiffres dans l'ordre pour nous assurer que les deux derniers chiffres sont aussi petits que possible lorsque la valeur du troisième au dernier chiffre est 4:
De cette manière, nous obtenons le résultat souhaité 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();
Trois étapes pour obtenir la transposition la plus proche:
1. Examinez la zone d'ordre inverse de l'arrière vers l'avant et trouvez le bit précédent de la zone d'ordre inverse, qui est la limite du remplacement du numéro.
2. Échangez le bit précédent de la zone d'ordre inverse avec le nombre juste supérieur à lui dans la zone d'ordre inverse
3. Inversez l'ordre d'origine Région à séquencer
Cette solution a un nom élevé: l'algorithme d'ordre du dictionnaire.
Quelques ajouts:
Cette bande dessinée est purement divertissante. Chérissez autant que possible votre travail actuel et n'imitez pas le comportement de Xiao Hui.
-----FIN-----
Amis qui aiment cet article, veuillez appuyer et maintenir l'image pour suivre le programmeur de compte d'abonnement Xiaohui et regarder du contenu plus passionnant