考试平台: 时习知
分值: 200分(第二题)
考试时间: 两小时(共2题)
题目描述
将电话号码转换,需要实现如下的中英文电话号码转换:
- 输入的字符串中每个数字对应为中文数字中的英文单词,如Double表示两个数字相同。
- 将输入的中文数字字符串转换为英文单词的电话号码。
- 若输入不合法,则输出字符串
ERROR
。
中英文数字,英文数字分别如下:
中文数字:Yi Er San Si Wu Liu Qi Ba Jiu Ling
英文数字:One Two Three Four Five Six Seven Eight Nine Zero
说明:
- 输入保证每个单词都是合法的英文数字单词/中文数字单词/Double;
- 合法的字符串长度不会太长,不会含空格;
- 若含Double:
- 合法情况下:其后必须跟随英文数字单词,代表两个数字,如DoubleSix,代表SixSix;
- 不合法情况下:其后跟随的不是英文数字单词,如DoubleLiu 或 DoubleDouble 都是非法的。
输入
一行仅由大小写字母组成的字符串,非空且长度不大于500。
输出
一个字符串,表示转换后的电话号码;若输入不合法,输出ERROR
。
示例1
输入:
SixOneThreeOneDoubleZero
输出:
LiuyiSanyilingLing
解释:
SixOneThreeOneDoubleZero 对应的转换结果为 LiuyiSanyilingLing
示例2
输入:
YiLingSanSanJiu
输出:
OneZeroThreeThreeNine
解释:
YiLingSanSanJiu 对应的转换结果为 OneZeroThreeThreeNine
示例3
输入:
DoubleLiu
输出:
ERROR
解释:
DoubleLiu 是非法输入
题解
该题目要求将输入的中英文数字字符串进行转换。如果输入字符串是中文数字单词,则将其转换为对应的英文数字单词;如果输入字符串是英文数字单词,则将其转换为对应的中文数字单词。此外,输入字符串中可能包含
Double
,表示后面的数字出现两次。若Double
后面不是合法的英文数字单词,则输入非法。题目分析
- 输入字符串可能包含中文数字或英文数字单词,以及
Double
。- 输入字符串需要逐个解析,处理
Double
情况时,需要特别小心,确保其后跟随的是合法的英文数字单词。- 字符串解析时,需要不断检查当前单词是否为合法的数字单词。
解题思路
- 使用两个列表分别存储中文数字单词和英文数字单词,以便进行相互转换。
- 遍历输入字符串,逐个解析单词,判断其是否为合法的数字单词或
Double
。- 如果遇到
Double
,检查其后是否跟随合法的英文数字单词,如果不是,则输出ERROR
。- 根据当前单词类型(中文或英文),进行对应的转换。
- 最后输出转换后的字符串,若中途发现非法输入,则输出
ERROR
。
Java
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[] cs = sc.nextLine().toCharArray();
List<String> en = Arrays.asList("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Zero", "Double");
List<String> ch = Arrays.asList("Yi", "Er", "San", "Si", "Wu", "Liu", "Qi", "Ba", "Jiu", "Ling");
boolean error = false; // 是否输入非法
int pos = 0; // 字符串解析到的索引位置
StringBuilder result = new StringBuilder();
String word = read(cs, pos);
String preWord = "";
// 中文 -> 英文
boolean covertEnglish = ch.contains(word);
while (pos < cs.length) {
word = read(cs, pos);
pos += word.length();
if (word.equals("Double")) {
// 不合法: DoubleDouble 、中文中出现 Double
if (word.equals(preWord) || covertEnglish) {
error = true;
break;
}
continue;
}
int idx = (covertEnglish ? ch.indexOf(word) : en.indexOf(word));
if (idx == -1) { // 转换失败
error = true;
break;
}
if (covertEnglish) {
result.append(en.get(idx));
if (preWord.equals("Double")) result.append(en.get(idx));
} else {
result.append(ch.get(idx));
}
preWord = word;
}
if (error) {
System.out.println("ERROR");
} else {
System.out.println(result.toString());
}
}
/**
* 从 cs 的 s 位置开始读取一个有效的单词或拼音
* @param cs
* @param s
* @return
*/
public static String read(char[] cs, int s) {
int e = s + 1;
for (; e < cs.length; e++) {
if ('A' <= cs[e] && cs[e] <= 'Z') {
break;
}
}
return new String(cs, s, e - s);
}
}
标签:Java,数字,真题,题解,单词,cs,Double,字符串,输入
From: https://blog.csdn.net/user_longling/article/details/141032261