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 }

 

posted @ 2021-04-15 12:22  没有你哪有我  阅读(461)  评论(0编辑  收藏  举报