题目描述
将一段压缩后的字符串解压缩,并且排序输出
解压规则:
每个字符串后面跟随一个数字,表示这个字符串的重复次数。例如,“a5”解压缩的结果为“aaaaa”;“abc3”解压缩后的结果为“abcabcabc”。
排序规则:
1、根据每个字符串的重复次数升序排序,然后输出结果。例如,“a3b2”,输出的结果为“bbaaa”。
2、如果字符重复次数一样,则根据ASCII编码顺序做升序排序,然后输出结果。例如,“b2a2”,输出的结果为“aabb”
输入描述:
输入的原始字符串仅包含字母和数字
输出描述:
输出的结果字符串仅包含字母
示例1
输入:a11b2bac3bad3abcd2
输出:bbabcdabcdbacbacbacbadbadbadaaaaaaaaaaa
解题思路:
首先解析字符串;
之后 将字母串与相关的重复次数存入自定义类中,使自定义类实现Comparable接口,在类内部添加比较方法。
将类对象存入TreeSet中,自动排序,最后打印输出。
首先, 定义类SingleString,如下:
class SingleString implements Comparable<SingleString> {
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<StringBuffer> all = new ArrayList<>();// 存字母串
ArrayList<StringBuffer> 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<SingleString> 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编码排序,导致测试用例未通过。