华为2018秋招笔试——将一段压缩后的字符串解压缩,并且排序输出

题目描述

将一段压缩后的字符串解压缩,并且排序输出

解压规则:

每个字符串后面跟随一个数字,表示这个字符串的重复次数。例如,“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编码排序,导致测试用例未通过。

    原文作者:Py_Wang
    原文地址: https://blog.csdn.net/Py_Wang/article/details/82503773
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞