网上看到类似的算法,不过实现是C++.
private static void alphaseq0(int n, String alphabet, StringBuffer buf) {
int len = alphabet.length();
if (n >= len) {
alphaseq0(n/len - 1,alphabet,buf);
n = n % len;
}
buf.append(alphabet.charAt(n));
}
本题的题意是: 给定一个 整数 n
和 字元集 alphabet
,return 一个对应的 string
而 对应的规则 如下:
(假设我们的字元集是英文字母 A-Z,也就是说这些字元是可以用来代表给定的整数的)
1 -> A
2 -> B
3 -> C
...
26 -> Z
27 -> AA
...
52 -> AZ
...
m -> ZZA
...
n -> ZZZ
n+1 -> AAAA
Cette question semble simple à première vue, mais il m'a en fait fallu beaucoup de temps pour l'étudier attentivement (je suis peut-être simple d'esprit...)
La signification de cette question est la suivante : étant donné un entier et un jeu de caractères, renvoie une chaîne correspondante
et la règle correspondante pour est la suivante :
J'ai tout de suite pensé à
. Si le nombre de changements dansitertools.product
Je peux facilement générer suffisamment de chaînes et sélectionner lan
ième :alphabet
n'est pas suffisant,return None
Donc si je veux récupérer la chaîne correspondant à
n=3000
;Mais le problème est que cela prend beaucoup de temps, pour la simple raison que je génère trop de choses inutiles. En comparant l'exemple C donné par l'affiche, je devrais générer directement la chaîne correspondante
Alors que devons-nous faire ? J'ai pensé à la conversion de portage. Ce problème n'est-il pas un problème de conversion de portage ?
Par exemple, regardons un exemple de conversion de décimal en hexadécimal :
En prenant 31 comme exemple, on divise d'abord 16 une fois pour obtenir le reste 15, puis on peut trouver son premier symbole
F
, puis on le divise une seconde fois pour obtenir le reste1
et on peut aussi découvrez son deuxième symbole Symbole Bit1
.Notre problème de conversion correspondant actuel n'est-il pas : nécessiter la conversion du nombre décimal (10 symboles 0-9) en hexadécimal (26 symboles A-Z) ?
Ce n'est pas facile. Suite à la méthode de conversion carry, il me suffit de continuer à diviser la longueur du jeu de caractères
len(alphabet)
(len(alphabet)
carry) pour interroger le symbole correspondant de chaque bit.Malheureusement, le problème n'est pas si simple. Avez-vous remarqué ? Cette correspondance partira de 1 au lieu de 0. Sans la correspondance de 0, toutes les règles semblent être beaucoup perturbées. chiffre décimal Le
26
devrait être porteur, mais il n'est pas ici26
correspond à un seul symboleZ
Il faut connaître les règles pour gérer la situation de division par 26 et laisser 0.J'ai donc commencé à observer les règles :
Nous retrouverons :
S'il ne s'agit pas d'un entier divisible (le reste n'est pas nul), alors les règles sont les mêmes que pour la conversion de bits. Vous pouvez directement utiliser le reste pour interroger le symbole correspondant et utiliser
商
comme dividende. faire la prochaine divisionS'il s'agit d'une division entière (le reste est zéro), il faut prendre le dernier signe, et la division suivante doit utiliser
(商-1)
comme dividende pour la division suivanteSelon cette règle, j'ai écrit deux versions de fonction. L'une consiste à utiliser récursive comme l'exemple de code C :
L'autre façon est d'utiliser itérer :
Tant que les chaînes converties par ces trois fonctions sont comparées, l'exactitude peut être confirmée.
Si l'affiche trouve quelque chose de différent de ce que souhaitait la question initiale ou si vous avez des commentaires, faites-le-moi savoir dans les commentaires !
Questions auxquelles j'ai répondu : Python-QA