Sphere Online Judge (SPOJ) 의 Next Palindrome 문제를 시도하고 있는데 최대 백만 자릿수의 정수에 대한 회문을 찾아야합니다. Strings를 뒤집기 위해 Java 함수를 사용하는 것에 대해 생각했지만 String이 길어질 수 있습니까?
Sphere Online Judge (SPOJ) 의 Next Palindrome 문제를 시도하고 있는데 최대 백만 자릿수의 정수에 대한 회문을 찾아야합니다. Strings를 뒤집기 위해 Java 함수를 사용하는 것에 대해 생각했지만 String이 길어질 수 있습니까?
답변:
당신은 길이의 문자열을 얻을 수 있어야합니다
Integer.MAX_VALUE
항상 2,147,483,647 (2 31-1 )
(Java 스펙에 의해 정의 됨, String 클래스가 내부 스토리지에 사용하는 배열의 최대 크기)
또는
Half your maximum heap size
(각 문자가 2 바이트 이므로) 더 작은 것입니다 .
내부 배열에 의해 유지되고 배열은 Java에서 정수로 색인화되므로 최대 2 ^ 31-1 자일 수 있다고 생각합니다.
getBytes
매우 큰 문자열을 시도하면 비슷한 문제가 발생할 수 있습니다.
이론적으로 Integer.MAX_VALUE자를 사용할 수 있지만 JVM은 사용할 수있는 배열의 크기가 제한됩니다.
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);
}
}
}
Java 8 업데이트 92 인쇄
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
참고 : Java 9에서 Strings는 byte []를 사용하므로 멀티 바이트 문자가 둘 이상의 바이트를 사용하고 최대 값을 더 줄입니다. 예를 들어 이모티콘과 같은 4 바이트 코드 포인트가 모두 있으면 약 5 억 자만 얻을 수 있습니다.
당신은 당신 의 전화 번호 BigDecimal
대신에 사용을 고려 했습니까 String
?
Integer.MAX_VALUE는 문자열의 최대 크기 + 메모리 크기에 따라 다르지만 구형 온라인 판사의 문제는 해당 기능을 사용할 필요가 없습니다.
Java9는 byte []를 사용하여 String.value를 저장하므로 Java9에서는 약 1GB 문자열 만 얻을 수 있습니다. 반면에 Java8은 2GB 문자열을 가질 수 있습니다.
문자 "I"는 "char"를 의미하므로 일부 문자는 일부 이모티콘과 같이 BMP에서 표현할 수 없으므로 더 많은 (현재 2) 문자가 필요합니다.