2020年 第11届 蓝桥杯JavaC组省赛——试题 I: 字符串编码
【问题描述】
时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分
小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大写字母,小明将它转换成它在 26 个英文字母中序号,即 A → 1, B → 2, ... Z → 26。
这样一个字符串就能被转化成一个数字序列:
比如 ABCXYZ → 123242526。
现在给定一个转换后的数字序列,小明想还原出原本的字符串。当然这样的还原有可能存在多个符合条件的字符串。小明希望找出其中字典序最大的字符串。
【输入格式】
一个数字序列。
【输出格式】
一个只包含大写字母的字符串,代表答案。
【样例输入】
123242526
【样例输出】
LCXYZ
【评测用例规模与约定】
对于 20% 的评测用例,输入的长度不超过 20。
对于所有评测用例,输入的长度不超过 200000。
ASCII码表
分析
该题一开始一位很难,后面发现题目要的是字典序最大的那个答案,这样一来就可以用贪心法做,遍历一遍数字序列,然后每次搜索两个两个数字,如果两个数字的组合不超过26,那么就用这两个数来解码出一个字母,反之则用前一个数字来解码字母。这样要注意的一点是如果当前数字为“0”时,那么当前数字将不可以单独解码为一个字母,就跳过即可,思路就是这样,下面直接上代码。
AC代码
1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Scanner; 4 5 public class Main { 6 public static void main(String[] args) { 7 Scanner input =new Scanner(System.in); 8 char[] c = input.next().toCharArray(); 9 input.close(); 10 int n = c.length; 11 12 List<String> list = new ArrayList<>(); 13 int i = 0; 14 while (i < n) { 15 if (c[i] == '0') { 16 i++; 17 continue; 18 } 19 if (i + 1 < n) { 20 int a = Integer.parseInt("" + c[i] + c[i + 1]); 21 if (a < 27) { 22 list.add("" + (char)(a + 'A' - 1)); 23 i += 2; 24 } else { 25 list.add("" + (char)(Integer.parseInt(c[i] + "")+ 'A' - 1)); 26 i++; 27 } 28 } else { 29 list.add("" + (char)(Integer.parseInt(c[i] + "")+ 'A' - 1)); 30 i++; 31 } 32 } 33 for (int k = 0; k < list.size(); k++) { 34 System.out.print(list.get(k)); 35 } 36 } 37 }