ファーウェイの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を定義します.次のようにします.
主な手順は次のとおりです.
試験により、提供された例では、bとabcdの並べ替えASCがASCII符号化に従って並べ替えられず、試験例が合格しなかったことが分かった.
圧縮された文字列を解凍し、出力をソートします.
解凍ルール:
各文字列の後ろには、この文字列の繰り返し回数を表す数字が付いています.例えば、「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符号化に従って並べ替えられず、試験例が合格しなかったことが分かった.