题目链接:
“简单”的字符串模拟,一看就会,一写就废。
思路:
要进行两种坐标表示方式的转换,首先可以把任务分成两部分:1.判断输入是哪种表示方式,2.输出另一种表示方式。
首先是判断部分:Excel型和RXCY型都既有字母又有数字,不是很好处理。经过思考之后,发现可以这样判断:第一个字符是R,第二个字符是数字,并且后面有一个C,则是RXCY型,否则是Excel型。
然后是表示方式的转换,其中字母转数字很简单,数字转字母稍微难一点。详见代码。
代码:
1.用倒序存储,倒序输出的方式处理数字转字母
//用倒序存储,倒序输出的方式处理数字转字母
#include <bits/stdc++.h>
using namespace std;
const int maxLen = 1000010;
int n;
char x[maxLen]; //输入坐标
int len; //坐标字符串的长度
void solve1(){
int idx1, idx2;
int row=0, col=0;
for(int i=0; i<len; i++){
if(x[i]=='R') idx1 = i;
else if(x[i]=='C') {idx2=i; break;}
}
//提取横纵坐标
for(int i=idx1+1; i<idx2; i++){
row = row*10 + (x[i]-'0');
}
for(int i=idx2+1; i<len; i++){
col = col*10 + (x[i]-'0');
}
string ans;
while(row){
ans += row%10 + '0';
row /= 10;
}
while(col){
if(col % 26 == 0) {col -= 26; ans += 'Z';} //要对'Z'特判,否则会输出'@'
else ans += col%26 + ('A'-1); //不是Z,按一般情况处理
col /= 26;
}
for(int i=ans.size()-1; i>=0; i--) cout << ans[i];
cout << '\n';
}
void solve2(){
int idx; //第一个数字的位置
for(idx=0; idx<len; idx++){
if(x[idx]<='9' && x[idx]>='0') break;
}
int row = 0, col = 0;
for(int i=idx; i<len; i++){
row = row*10 + (x[i]-'0');
}
for(int i=0; i<idx; i++){
col = col*26 + (x[i]-'A'+1);
}
cout << 'R' << row << 'C' << col << '\n';
}
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n;
while(n--){
cin >> x;
len = strlen(x); //坐标字符串的长度
bool isRXCY = false;
if(x[0] == 'R' && x[1]<='9' && x[1]>='0'){
for(int i=2; i<len; i++){
if(x[i] == 'C') {isRXCY=true; break;}
}
}
if(isRXCY) solve1(); //RXCY转Excel
else solve2(); //Excel转RXCY
}
}
2.另外一种更好的做法,用递归处理数字转字母(print_col函数)
//另外一种更好的做法,用递归处理数字转字母(print_col函数)
#include <bits/stdc++.h>
using namespace std;
const int maxLen = 1000010;
int n;
char x[maxLen]; //输入坐标
int len; //坐标字符串的长度
void print_col(int col){ //用递归的方法把列数字转成字母串输出
if(col == 0) return; //递归出口
if(col%26 == 0) {print_col(col/26-1); cout << 'Z';} //对Z的特判
else {print_col(col/26); cout << (char)(col%26+('A'-1));} //一般情况
}
void solve1(){
int idx1, idx2;
int row=0, col=0;
for(int i=0; i<len; i++){
if(x[i]=='R') idx1 = i;
else if(x[i]=='C') {idx2=i; break;}
}
//提取横纵坐标
for(int i=idx1+1; i<idx2; i++){
row = row*10 + (x[i]-'0');
}
for(int i=idx2+1; i<len; i++){
col = col*10 + (x[i]-'0');
}
print_col(col); //由列数生成对应的字母串
cout << row << '\n'; //行数直接输出即可
}
void solve2(){
int idx; //第一个数字的位置
for(idx=0; idx<len; idx++){
if(x[idx]<='9' && x[idx]>='0') break;
}
int row = 0, col = 0;
for(int i=idx; i<len; i++){
row = row*10 + (x[i]-'0');
}
for(int i=0; i<idx; i++){
col = col*26 + (x[i]-'A'+1);
}
cout << 'R' << row << 'C' << col << '\n';
}
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n;
while(n--){
cin >> x;
len = strlen(x); //坐标字符串的长度
bool isRXCY = false;
if(x[0] == 'R' && x[1]<='9' && x[1]>='0'){
for(int i=2; i<len; i++){
if(x[i] == 'C') {isRXCY=true; break;}
}
}
if(isRXCY) solve1(); //RXCY转Excel
else solve2(); //Excel转RXCY
}
}