ファーウェイの2018秋の筆記試験-圧縮された文字列を解凍し、ソートして出力する

2774 ワード

タイトルの説明
圧縮された文字列を解凍し、出力をソートします.
解凍ルール:
各文字列の後ろには、この文字列の繰り返し回数を表す数字が付いています.例えば、「a 5」解凍の結果は「aaaa」である.「abc 3」解凍後の結果は「abcabcabc」であった.
ソート・ルール:
1、各文字列の繰り返し回数に応じて昇順に並べ替え、結果を出力します.例えば、「a 3 b 2」は、出力の結果が「bbaaa」である.
2、文字の繰り返し回数が同じであれば、ASCII符号化順に昇順に並べ替え、結果を出力します.例えば、「b 2 a 2」は、出力結果が「aabb」である
説明を入力:
入力された元の文字列には、アルファベットと数値のみが含まれます.
出力の説明:
出力された結果文字列にはアルファベットのみが含まれます
例1
入力:a 11 b 2 bac 3 bad 3 abcd 2
出力:b b b b a b cdabcdabcdabcdbacbacbacbadbadbadaaa
 
問題解決の考え方:
まず文字列を解析します.
その後、文字列と関連する繰り返し回数をカスタムクラスに格納し、カスタムクラスにComparableインタフェースを実現させ、クラス内部に比較方法を追加します.
クラスオブジェクトをTreeSetに格納し、自動的にソートし、最後に出力を印刷します.
まず、クラスSingleStringを定義します.次のようにします.
class SingleString implements Comparable {
	public String name;
	public int value;

	SingleString(String name, int value) {
		this.name = name;
		this.value = value;
	}

	@Override
	public int compareTo(SingleString singleString) {
		if (singleString.value > this.value) {//       
			return -1;
		} else if (singleString.value == this.value && (singleString.name.compareTo(this.name)) > 0) {//       ,     ASCII    
			return -1;
		} else {
			return 1;
		}
	}
}

主な手順は次のとおりです.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import java.util.TreeSet;

public class StringDecrypt {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String string = scanner.nextLine().trim();
		char[] chars = string.trim().toCharArray();//         
		ArrayList all = new ArrayList<>();//     
		ArrayList allValue = new ArrayList<>();//         
		int index = -1;//            
		for (int i = 0; i < chars.length; i++) {
			if (Character.isDigit(chars[i])) {//      
				if (i == 0 || !Character.isDigit(chars[i - 1])) {//         
					allValue.add(new StringBuffer());//  ,  StringBuffer
				}
				allValue.get(index).append(chars[i]);
			} else {//      
				if(i == 0 || !Character.isLetter(chars[i -1])) {//         
					all.add(new StringBuffer());//  ,  StringBuffer
					index++;
				}
				all.get(index).append(chars[i]);
			}
		}
		TreeSet result = new TreeSet<>();//  SingleString  ,  
		for(int i = 0 ; i < allValue.size(); i++) {
			result.add(new SingleString(all.get(i).toString(), Integer.parseInt(allValue.get(i).toString())));
		}
		for(SingleString s: result) {//     
			int value = s.value;
			String out = s.name;
			for(int i = 0; i < value; i++)
			System.out.print(out);
		}
		System.out.println();
	}
}

試験により、提供された例では、bとabcdの並べ替えASCがASCII符号化に従って並べ替えられず、試験例が合格しなかったことが分かった.