PAT1078字串壓縮與解壓(java實現)

TNTZS666發表於2019-01-24

題目描述:

文字壓縮有很多種方法,這裡我們只考慮最簡單的一種:把由相同字元組成的一個連續的片段用這個字元和片段中含有這個字元的個數來表示。例如 ccccc 就用 5c 來表示。如果字元沒有重複,就原樣輸出。例如 aba 壓縮後仍然是 aba。

解壓方法就是反過來,把形如 5c 這樣的表示恢復為 ccccc。

本題需要你根據壓縮或解壓的要求,對給定字串進行處理。這裡我們簡單地假設原始字串是完全由英文字母和空格組成的非空字串。


  • 輸入格式
    輸入第一行給出一個字元,如果是 C 就表示下面的字串需要被壓縮;如果是 D 就表示下面的字串需要被解壓。第二行給出需要被壓縮或解壓的不超過 1000 個字元的字串,以回車結尾。題目保證字元重複個數在整型範圍內,且輸出檔案不超過 1MB。

  • 輸出格式
    根據要求壓縮或解壓字串,並在一行中輸出結果。


解題思路:這道題首先先用一個字元接收後判斷是壓縮還是解壓,如果是壓縮,for迴圈以字元遍歷,字元相同index++否則就通過append方法將此字元接到結果字串上。解壓通用for迴圈遍歷,但是不同的是如果接收到數字後要將對應的字元輸出num遍

易錯點:解壓時要注意有的字元出現可能幾十次幾百次,這裡也卡了好久,後面看別人程式碼num =num * 10 + (now - ‘0’)很nice的解決了這個問題


程式:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
public static void main(String[] args) throws IOException {
	BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
	char a = bf.readLine().charAt(0);
	char[] b = bf.readLine().toCharArray();
	StringBuilder output = new StringBuilder();
	if (a=='C') {
		char c = b[0];
		int index = 1;
		for (int i = 1; i < b.length; i++) {
			char now = b[i];
			if (now==c) {
				index++;
				if (i==b.length-1) {
					output.append(index);
				}
			}else {
				if (index!=1) {
					output.append(index);
				}
				output.append(c);
				c = now;	//將下一個字元作為比較字元
				index = 1;	//更新該字元出現的次數
			}
		}
		output.append(c);
		System.out.println(output);
	}
	if (a=='D') {
		int num = 0;
		for (int i = 0; i < b.length; i++) {
			char now = b[i];
			//判斷第i個字元是不是數字
			if (now>='0'&&now<='9') {
				num =num * 10 + (now - '0');//這行程式碼解決了如果數字不是一位數的問題
				//num = Integer.parseInt(String.valueOf(now));
			}else {
				if (num==0) {
					output.append(now);
				}
				for (int j = 0; j < num; j++) {
					output.append(now);
				}
				num = 0;
			}
		}	
		System.out.println(output);
	}
	
}
}

相關文章