AcWing 698. 读电话号码(Java)
原题链接
简单
作者:
Limited
,
2021-02-05 17:46:55
,
所有人可见
,
阅读 367
思路
- 打表英文单词
- 电话号码按划分格式拆分成多个区间依次进行以下操作
- 第一次遍历电话号码:逆序,统计连续次数(后缀和?) 122333444 –> 0102103210 从0开始计数
- 第二次遍历电话号码:顺序,连续次数超过10次(从0开始故>9标识超过10次)的标记为不连续
- 第三次遍历电话号码:顺序,如果当前位置连续次数不为0并且前一个位置的连续次数为0,则当前位置的连续次数是这小段最大的次数,按次数输出对应的前缀英文;如果当前位置连续次数为0,输出当前位置的数字英文
代码
import java.lang.*;
import java.util.*;
public class Main {
static Scanner scanner = new Scanner(System.in);
// 数字
static String[] nums = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
// 连续数字简写前缀
static String[] combo = {"", "double", "triple", "quadruple", "quintuple", "sextuple", "septuple", "octuple", "nonuple", "decuple"};
// 字符数组存输入的电话号码
static char[] number = new char[110];
// 从后往前 统计当前数字连续次数(从0开始) 如 1223334444 --> 0102103210
static int[] repeatSum = new int[110];
// 翻译某一段数字为英文 start:起点索引 len:分段长度
public static String translate(int start, int len) {
StringBuilder sb = new StringBuilder();
// 本分段的最后一个数字 连续次数 赋初始值为0
repeatSum[start + len - 1] = 0;
// 从本分段倒数第二个数字开始逆序循环
for (int i = start + len - 2; i >= start; i--) {
// 若本数字与前一个数字相同 连续次数+1 若不同则置为0
repeatSum[i] = number[i] == number[i + 1] ? repeatSum[i + 1] + 1 : 0;
}
// 顺序遍历 如果某一小段连续次数超过10(从0开始计数 所以此时repeatSum[i]>9)将这一小段连续数字的连续次数都置0
for (int i = start; i < start + len; i++) {
if (repeatSum[i] > 9) {
while (repeatSum[i] != 0) {
repeatSum[i++] = 0;
}
}
}
// 顺序遍历 并翻译
for (int i = start; i < start + len; i++) {
// 如果连续次数不为0并且前一个数字的连续次数为0 则当前位置的连续次数是这小段最大的次数 对应前缀添加到sb末尾
if (repeatSum[i] > 0 && (i == start || repeatSum[i - 1] == 0)) {
sb.append(" ").append(combo[repeatSum[i]]);
} else if (repeatSum[i] == 0) { // 如果连续次数为0 对应数字英文添加到sb末尾
sb.append(" ").append(nums[number[i] - '0']);
}
}
return sb.toString();
}
public static void main(String[] args) {
int t = scanner.nextInt();
for (int k = 1; k <= t; k++) {
number = scanner.next().toCharArray(); // 获取电话号码
String[] splitArr = scanner.next().split("-"); // 获取划分格式数值 并转为String[]数组
StringBuilder ans = new StringBuilder(); // 存放最终答案
int cur = 0; // 分段起始点
for (String str : splitArr) { // 遍历划分格式
int len = Integer.parseInt(str); // 转为数字
ans.append(translate(cur, len)); // 翻译某分段 将翻译结果添加到答案末尾
cur += len; // 更新分段起始点
}
System.out.printf("Case #%d: %s\n", k, ans);
}
}
}