Immutable String - Problems & Solutions
Sevimli tilingizdagi satr o'zgarmas yoki o'zgarmasligini oldingi maqolada bilishingiz kerak. Agar satr o'zgarmas bo'lsa, u ba'zi muammolarni keltirib chiqaradi. Umid qilamizki, biz ham oxirida yechimni taqdim etamiz.
O'zgartirish operatsiyasi
Shubhasiz, oʻzgarmas qatorni oʻzgartirib boʻlmaydi. Belgilardan faqat bittasini o'zgartirmoqchi bo'lsangiz, yangi qator yaratishingiz kerak.
Java-da satrlarni birlashtirishdan ehtiyot bo'ling
Satrlarni birlashtirishda
juda ehtiyot bo'lishingiz kerak. For tsiklida bir necha marta satrlarni birlashtirish misolini ko'rib chiqaylik:
#include <iostream>
int main() {
string s = "";
int n = 10000;
for (int i = 0; i < n; i++) {
s += "hello";
}
}
// "static void main" must be defined in a public class.
public class Main {
public static void main(String[] args) {
String s = "";
int n = 10000;
for (int i = 0; i < n; i++) {
s += "hello";
}
}
}
Java uchun satrlarni birlashtirish qanchalik sekin ekanligiga e'tibor bering? Boshqa tomondan, C ++ da sezilarli ishlash ta'siri yo'q.
Java-da, satr o'zgarmas
bo'lgani uchun, birlashtirish birinchi navbatda yangi satr uchun etarli joy ajratish, eski satrdan tarkibni nusxalash va yangi satrga qo'shish orqali ishlaydi.
Shunday qilib, umumiy vaqt murakkabligi quyidagicha bo'ladi:
5 + 5 × 2 + 5 × 3 + … + 5 × n = 5 × (1 + 2 + 3 + … + n) = 5 × n × (n + 1) / 2,
Bu O(n2)
.
Solutions
Agar siz satringiz o'zgaruvchan bo'lishini istasangiz, ba'zi almashtirishlar mavjud:
1. Agar satringiz oʻzgaruvchan boʻlishini istasangiz, uni belgilar massiviga oʻzgartirishingiz mumkin.
// "static void main" must be defined in a public class.
public class Main {
public static void main(String[] args) {
String s = "Hello World";
char[] str = s.toCharArray();
str[5] = ',';
System.out.println(str);
}
}
Agar satrlarni tez-tez birlashtirishga toʻgʻri kelsa,
StringBuilder
kabi boshqa maʼlumotlar tuzilmalaridan foydalangan maʼqulroq boʻladi. Quyidagi kodO(n)
murakkabligida ishlaydi.
// "static void main" must be defined in a public class.
public class Main {
public static void main(String[] args) {
int n = 10000;
StringBuilder str = new StringBuilder();
for (int i = 0; i < n; i++) {
str.append("hello");
}
String s = str.toString();
}
}
© Leetcode link
Last updated
Was this helpful?