电话号码转换 - 华为机试真题题解(Java)

考试平台: 时习知

分值: 200分(第二题)

考试时间: 两小时(共2题)

华为机试真题

题目描述

将电话号码转换,需要实现如下的中英文电话号码转换:

  • 输入的字符串中每个数字对应为中文数字中的英文单词,如Double表示两个数字相同。
  • 将输入的中文数字字符串转换为英文单词的电话号码。
  • 若输入不合法,则输出字符串ERROR

中英文数字,英文数字分别如下:

中文数字:Yi Er San Si Wu Liu Qi Ba Jiu Ling
英文数字:One Two Three Four Five Six Seven Eight Nine Zero

说明:

  1. 输入保证每个单词都是合法的英文数字单词/中文数字单词/Double;
  2. 合法的字符串长度不会太长,不会含空格;
  3. 若含Double:
    • 合法情况下:其后必须跟随英文数字单词,代表两个数字,如DoubleSix,代表SixSix;
    • 不合法情况下:其后跟随的不是英文数字单词,如DoubleLiu 或 DoubleDouble 都是非法的。

输入

一行仅由大小写字母组成的字符串,非空且长度不大于500。

输出

一个字符串,表示转换后的电话号码;若输入不合法,输出ERROR

示例1

输入:
SixOneThreeOneDoubleZero

输出:
LiuyiSanyilingLing

解释:
SixOneThreeOneDoubleZero 对应的转换结果为 LiuyiSanyilingLing

示例2

输入:
YiLingSanSanJiu

输出:
OneZeroThreeThreeNine

解释:
YiLingSanSanJiu 对应的转换结果为 OneZeroThreeThreeNine

示例3

输入:
DoubleLiu

输出:
ERROR

解释:
DoubleLiu 是非法输入

题解

该题目要求将输入的中英文数字字符串进行转换。如果输入字符串是中文数字单词,则将其转换为对应的英文数字单词;如果输入字符串是英文数字单词,则将其转换为对应的中文数字单词。此外,输入字符串中可能包含 Double,表示后面的数字出现两次。若 Double 后面不是合法的英文数字单词,则输入非法。

题目分析

  1. 输入字符串可能包含中文数字或英文数字单词,以及 Double
  2. 输入字符串需要逐个解析,处理 Double 情况时,需要特别小心,确保其后跟随的是合法的英文数字单词。
  3. 字符串解析时,需要不断检查当前单词是否为合法的数字单词。

解题思路

  1. 使用两个列表分别存储中文数字单词和英文数字单词,以便进行相互转换。
  2. 遍历输入字符串,逐个解析单词,判断其是否为合法的数字单词或 Double
  3. 如果遇到 Double,检查其后是否跟随合法的英文数字单词,如果不是,则输出 ERROR
  4. 根据当前单词类型(中文或英文),进行对应的转换。
  5. 最后输出转换后的字符串,若中途发现非法输入,则输出 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);
    }

}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什码情况

你的鼓励就是我最大的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值