華為2018秋招筆試——將一段壓縮後的字串解壓縮,並且排序輸出
阿新 • • 發佈:2019-01-29
題目描述
將一段壓縮後的字串解壓縮,並且排序輸出
解壓規則:
每個字串後面跟隨一個數字,表示這個字串的重複次數。例如,“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編碼排序,導致測試用例未通過。