嘗試通過用數字替換重復字符來“壓縮”字串(例如,字串aabcccccaaa將變為a2blc5a3)。我嘗試使用 Linked HashMap 來解決問題,因為需要保留輸入順序,但是我創建的計數器似乎沒有正確遞增。任何見解將不勝感激。
public class StringCompression {
public static void main(String[] args) {
String s = "aabcccccaaa";
System.out.println(compString(s));
}
public static String compString(String str) {
LinkedHashMap <Character, Integer> alphabet = new LinkedHashMap<>();
StringBuilder strbdr = new StringBuilder();
for(int i = 0; i < str.length(); i ) {
if(alphabet.containsKey(str.charAt(i))) {
alphabet.put(str.charAt(i), alphabet.get(str.charAt(i)) 1);
}
alphabet.put(str.charAt(i), 1);
}
// System.out.println(alphabet.entrySet());
for(var entry : alphabet.entrySet()) {
strbdr.append(entry.getKey());
strbdr.append(entry.getValue());
}
return strbdr.toString();
}
}
uj5u.com熱心網友回復:
問題一
該行alphabet.put(str.charAt(i), 1)不斷將每個值重置為1,您需要將其放入else
for (int i = 0; i < str.length(); i ) {
if (alphabet.containsKey(str.charAt(i))) {
alphabet.put(str.charAt(i), alphabet.get(str.charAt(i)) 1);
} else {
alphabet.put(str.charAt(i), 1);
}
}
問題二
第一個修復導致a5b1c5地圖具有唯一鍵,因此您無法計算a開頭和a結尾的
只需跟蹤之前看到的字符和計數器
public static String compString(String str) {
StringBuilder sb = new StringBuilder();
char prev = '\0';
int count = 0;
for (char letter : str.toCharArray()) {
if (prev == '\0') {
prev = letter;
} else if (prev != letter) {
sb.append(prev).append(count);
count = 0;
prev = letter;
}
count = 1;
}
return sb.append(prev).append(count).toString();
}
uj5u.com熱心網友回復:
alphabet.put(str.charAt(i), 1);
不在 else 陳述句中并且每次都執行
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392754.html
