PAT乙級——1078(字串壓縮和解壓 判斷邊界)Java實現
阿新 • • 發佈:2018-12-10
題目:字串壓縮與解壓 (20 分)
文字壓縮有很多種方法,這裡我們只考慮最簡單的一種:把由相同字元組成的一個連續的片段用這個字元和片段中含有這個字元的個數來表示。例如 ccccc 就用 5c 來表示。如果字元沒有重複,就原樣輸出。例如 aba
壓縮後仍然是 aba
。
解壓方法就是反過來,把形如 5c
這樣的表示恢復為 ccccc
。
本題需要你根據壓縮或解壓的要求,對給定字串進行處理。這裡我們簡單地假設原始字串是完全由英文字母和空格組成的非空字串。
輸入格式:
輸入第一行給出一個字元,如果是 C
就表示下面的字串需要被壓縮;如果是 D
就表示下面的字串需要被解壓。第二行給出需要被壓縮或解壓的不超過 1000 個字元的字串,以回車結尾。題目保證字元重複個數在整型範圍內,且輸出檔案不超過 1MB。
輸出格式:
根據要求壓縮或解壓字串,並在一行中輸出結果。
輸入樣例 1:
C
TTTTThhiiiis isssss a tesssst CAaaa as
輸出樣例 1:
5T2h4is i5s a3 te4st CA3a as
輸入樣例 2:
D
5T2h4is i5s a3 te4st CA3a as10Z
輸出樣例 2:
TTTTThhiiiis isssss a tesssst CAaaa asZZZZZZZZZZ
題目分析及實現
首先可以分兩塊來實現,將解壓和壓縮分開
壓縮的時候
判斷上一個字元與當前字元的一致性,一樣個數加一,不一樣將個數和上一個字元加入字串,這裡面需要注意的是邊界,加入佇列的點因該有兩個,一個字元發生變化,另一個是結尾處沒有變化。
解壓的時候
需要注意的是,數字可能會是 13 ,564 這樣的數字,超過了一位,這個時候需要先判斷是不是數字,是的話累加,作為迴圈輸出的邊界
//AC
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
char a = in.nextLine().charAt(0);
StringBuilder output = new StringBuilder();
String input = in. nextLine();
in.close();
// 壓縮
if (a == 'C') {
char last = input.charAt(0);
int index = 1;
for (int i = 1; i < input.length(); i++) {
char now = input.charAt(i);
if (now == last) {
index++;
// 加入佇列的邊界一:相同且到最後
if (i == input.length() - 1)
output.append(index);
} else {
// 邊界二:發生變化
// 當數字是1時,只加入字元
if (index != 1)
output.append(index);
output.append(last);
last = now;// 更新上一個字元
index = 1;// 更新計數器
}
}
output.append(last);
System.out.println(output);
}
// 解壓
else {
int num = 0;
for (int i = 0; i < input.length(); i++) {
char now = input.charAt(i);
if (now <= '9' && now >= '0') {
// 判斷是不是數字,累加
num = num * 10 + (now - '0');
} else {
if (num == 0)
// 當num為零,既字元前沒有數,只將字元加入字串
output.append(input.charAt(i));
for (int j = 0; j < num; j++) {
// 迴圈加字串
output.append(input.charAt(i));
}
num = 0;
}
}
System.out.println(output);
}
}
}