ฉันกำลังลองปัญหาThe Next Palindromeจาก Sphere Online Judge (SPOJ) ที่ฉันต้องการค้นหา palindrome สำหรับจำนวนเต็มสูงถึงหลักล้าน ฉันคิดเกี่ยวกับการใช้ฟังก์ชั่นของ Java ในการย้อนกลับสตริง แต่พวกเขาจะอนุญาตให้ String ยาวหรือไม่
ฉันกำลังลองปัญหาThe Next Palindromeจาก Sphere Online Judge (SPOJ) ที่ฉันต้องการค้นหา palindrome สำหรับจำนวนเต็มสูงถึงหลักล้าน ฉันคิดเกี่ยวกับการใช้ฟังก์ชั่นของ Java ในการย้อนกลับสตริง แต่พวกเขาจะอนุญาตให้ String ยาวหรือไม่
คำตอบ:
คุณควรจะได้ความยาวของสตริง
Integer.MAX_VALUE
2,147,483,647เสมอ(2 31 - 1)
(กำหนดโดยข้อมูลจำเพาะ Java ขนาดสูงสุดของอาร์เรย์ซึ่งคลาส String ใช้สำหรับหน่วยเก็บข้อมูลภายใน)
หรือ
Half your maximum heap size
(ตั้งแต่ตัวละครแต่ละตัวเป็นสอง bytes) แล้วแต่จำนวนใดจะมีขนาดเล็กลง
ฉันเชื่อว่าพวกเขาสามารถมีอักขระได้สูงสุด 2 ^ 31-1 เนื่องจากมีอาร์เรย์ภายในอยู่และอาร์เรย์จะถูกทำดัชนีโดยจำนวนเต็มใน Java
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);
}
}
}
บนการอัปเดต Oracle 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 สตริงจะใช้ไบต์ [] ซึ่งหมายความว่าอักขระหลายไบต์จะใช้มากกว่าหนึ่งไบต์และลดค่าสูงสุดให้มากขึ้น หากคุณมีรหัสจุดสี่ไบต์เช่น emojis คุณจะได้รับประมาณ 500 ล้านตัวอักษร
คุณคิดว่าจะใช้BigDecimal
แทนString
การถือตัวเลขของคุณหรือไม่?
Integer.MAX_VALUE คือขนาดสูงสุดของสตริง + ขึ้นอยู่กับขนาดหน่วยความจำของคุณ แต่ปัญหาจากการตัดสินออนไลน์ของทรงกลมที่คุณไม่ต้องใช้ฟังก์ชั่นเหล่านั้น
Java9 ใช้ byte [] เพื่อเก็บ String.value ดังนั้นคุณจะได้รับ 1GB Strings ใน Java9 เท่านั้น Java8 ในอีกทางหนึ่งสามารถมี 2GB Strings
โดยตัวละครฉันหมายถึง "ตัวอักษร" อักขระบางตัวไม่สามารถใช้แทน BMP (เช่นอิโมจิบางตัว) ดังนั้นมันจะใช้ตัวอักษร (ปัจจุบัน 2) มากขึ้น
ส่วนกองก็แย่ลงเพื่อนของฉัน UTF-16 ไม่รับประกันว่าจะถูก จำกัด ไว้ที่ 16 บิตและสามารถขยายได้ถึง 32
char
ประเภทเป็น 16 บิตตรงดังนั้นจำนวนของบิต UTF-16 ใช้ไม่ได้เรื่องจริงๆ ...