当前位置 : 主页 > 编程语言 > java >

C/C++/Python描述 第十一届蓝桥杯省赛 第一场(2020.7.5) 试题 I: 字符串编码 题目+题

来源:互联网 收集:自由互联 发布时间:2022-10-26
第十一届蓝桥杯省赛C/C++大学B组 第一场   大家好,我叫亓官劼(qí guān jié ) 试题 I: 字符串编码 时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分 【问题描述】 小明发明了一种给由


第十一届蓝桥杯省赛C/C++大学B组 第一场

  大家好,我叫亓官劼(qí guān jié )


C/C++/Python描述 第十一届蓝桥杯省赛 第一场(2020.7.5) 试题 I: 字符串编码 题目+题解_字符串

试题 I: 字符串编码

时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分

【问题描述】

小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大

写字母,小明将它转换成它在 26 个英文字母中序号,即 A → 1, B → 2, … Z →

26。

这样一个字符串就能被转化成一个数字序列:

比如 ABCXYZ → 123242526。

现在给定一个转换后的数字序列,小明想还原出原本的字符串。当然这样

的还原有可能存在多个符合条件的字符串。小明希望找出其中字典序最大的字

符串。

【输入格式】

一个数字序列。

【输出格式】

一个只包含大写字母的字符串,代表答案

【样例输入】

123242526

【样例输出】

LCXYZ

【评测用例规模与约定】

对于 20% 的评测用例,输入的长度不超过 20。

对于所有评测用例,输入的长度不超过 200000。

试题I 题解

#include <iostream>
#include <vector>
using namespace std;
int main(){
string in ;
cin>>in;
int len = in.length();
string re = "";
int flag_1;//第一位为1
int flag_2;//第一位为2
flag_1 = flag_2 = 0;
for(int i = 0;i < len;i++){
if(flag_1){
int mid = int(in[i-1]-'0')*10+int(in[i]-'0');
re += char(mid+'A'-1);
flag_1 = 0;
continue;
}
if(flag_2){
if(in[i]<='6'){
int mid = int(in[i-1]-'0')*10+int(in[i]-'0');
re += char(mid+'A'-1);
flag_2 = 0;
} else{
re += char(in[i-1] - '0' +'A'-1);
re += char(in[i] - '0' +'A'-1);
flag_2 = 0;
}
continue;
}
if(in[i] >= '3')
re += char(in[i] - '0' + 'A' - 1);
if(in[i] == '1' ){
if(i+2<=len-1 && in[i] == '0'){
re += char(in[i] - '0' + 'A' - 1);
continue;
}
flag_1 = 1;
}
if(in[i] == '2'){
if(i+2<=len-1 && in[i] == '0'){
re += char(in[i] - '0' + 'A' - 1);
continue;
}
flag_2 = 1;
}
}
cout<<re;
return 0;
}

C++解法二

#include <iostream>
#include <vector>
using namespace std;
int main(){
string in;
string re = "";
cin>>in;
int len = in.length();
// 为字符串增加一位,防止溢出,且不让他与最后一位联合后的值小于26
in = in + 'Z';
for(int i = 0 ; i < len ;){
int temp = int(in[i] - '0') * 10 + int(in[i+1] - '0');
if(temp > 26){
re = re + char(in[i] - '0' + 'A' -1);
i++;

}else{
re = re + char(temp + 'A' -1);
i += 2;
}
}
cout<<re;
return 0;
}

Python解法

a = input()
len = a.__len__()
# 末尾加个字符,但是len还是之前的len,这样可以防止处理之后越界
a = a + 'Z'
i = 0
re = ""
while( i < len):
temp = int(a[i]) * 10 + int(a[i+1])
# 连续两个无法连续
if(temp > 26):
re = re + chr(int(a[i]) + 65 -1)
i = i + 1
else:
re = re + chr(temp + 65 -1)
i = i + 2
print(re)


上一篇:vim中文乱码问题的解决
下一篇:没有了
网友评论