1. 程式人生 > >華為2018秋招筆試——將一段壓縮後的字串解壓縮,並且排序輸出

華為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編碼排序,導致測試用例未通過。