J'essaie The Next Palindrome problème de Sphere Online Judge (SPOJ) où je dois trouver un palindrome pour un entier pouvant aller jusqu'à un million de chiffres. J'ai pensé utiliser les fonctions de Java pour inverser les chaînes, mais permettraient-elles qu'une chaîne soit aussi longue?
Vous devriez pouvoir obtenir une chaîne de longueur
Integer.MAX_VALUE
toujours 2 147 483 647 (231 - 1)
(Défini par la spécification Java, la taille maximale d'un tableau, que la classe String utilise pour le stockage interne)
OU
_Half your maximum heap size
_ (puisque chaque caractère est constitué de deux octets) , le plus petit des deux .
Je pense qu’ils peuvent contenir jusqu’à 2 ^ 31-1 caractères, car ils sont gérés par un tableau interne, et les tableaux sont indexés par des entiers en Java.
Bien que vous puissiez théoriquement utiliser les caractères Integer.MAX_VALUE, la taille de la matrice JVM pouvant être utilisée est limitée.
public static void main(String... args) {
for (int i = 0; i < 4; i++) {
int len = Integer.MAX_VALUE - i;
try {
char[] ch = new char[len];
System.out.println("len: " + len + " OK");
} catch (Error e) {
System.out.println("len: " + len + " " + e);
}
}
}
sur Oracle Java 8 mise à jour 92 impressions
len: 2147483647 Java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483646 Java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483645 OK
len: 2147483644 OK
Remarque: dans Java 9, Strings utilisera byte [], ce qui signifie que les caractères multi-octets utiliseront plus d'un octet et réduiront davantage le maximum. Si vous avez les quatre points de code sur quatre octets, par exemple emojis, vous n’obtiendrez que 500 millions de caractères environ
Avez-vous envisagé d'utiliser BigDecimal
au lieu de String
pour conserver vos numéros?
Integer.MAX_VALUE est la taille maximale de la chaîne + dépend de la taille de votre mémoire, mais le problème sur le juge en ligne de la sphère vous interdit d'utiliser ces fonctions
Java9 utilise byte [] pour stocker String.value, de sorte que vous ne pouvez obtenir que des chaînes d'environ 1 Go en Java9. Java8 d'autre part peut avoir des chaînes de 2 Go.
Par caractère, je veux dire "caractères", un caractère n'est pas représentable dans BMP (comme certains emojis), il faudra donc plus de caractères (actuellement 2).
La partie de tas empire, mes amis. UTF-16 n'est pas garanti d'être limité à 16 bits et peut s'étendre jusqu'à 32