[算法]华为笔试题——拼音与英文转换
2017-08-31 10:56
211 查看
题目描述:
编写拼音与英文转换的函数,如果输入号码是英文,转成拼音,如果是拼音,转成英文,例如输入OneZeroDoubleThree,则输出YiLingSanSan。
拼音、英文见下表:
Yi Er San Si Wu Liu Qi Ba Jiu Ling
One Two Three Four Five Six Seven Eight Nine Zero
注意:每个单词均为首字母大写,遇到连续两个相同数字,输入可以前面加Double,输出不可以加Double。
输入描述:
由首字母大写的字符串,字符输入范围是0,1,2,3,4,5,6,7,8,9的英文单词或者中文拼音。
输出描述:
如果输入是英文单词,输出拼音。如果输入是拼音,输出英文单词。不能混合出现,输入非法,输出ERROR。
示例:
输入:
OneTwoDoubleThree
输出:
YiErSanSan
思路:首先,分词,根据大写字母将字符串进行分词。然后,进行匹配和替换,着重考虑一下Double。最后,处理各种非法情况。
代码:
编写拼音与英文转换的函数,如果输入号码是英文,转成拼音,如果是拼音,转成英文,例如输入OneZeroDoubleThree,则输出YiLingSanSan。
拼音、英文见下表:
Yi Er San Si Wu Liu Qi Ba Jiu Ling
One Two Three Four Five Six Seven Eight Nine Zero
注意:每个单词均为首字母大写,遇到连续两个相同数字,输入可以前面加Double,输出不可以加Double。
输入描述:
由首字母大写的字符串,字符输入范围是0,1,2,3,4,5,6,7,8,9的英文单词或者中文拼音。
输出描述:
如果输入是英文单词,输出拼音。如果输入是拼音,输出英文单词。不能混合出现,输入非法,输出ERROR。
示例:
输入:
OneTwoDoubleThree
输出:
YiErSanSan
思路:首先,分词,根据大写字母将字符串进行分词。然后,进行匹配和替换,着重考虑一下Double。最后,处理各种非法情况。
代码:
package com; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Scanner; import java.util.Set; public class Test { static String[] english = {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"}; static String[] pinyin = {"Ling", "Yi", "Er", "San", "Si", "Wu", "Liu", "Qi", "Ba", "Jiu"}; static List<String> elist = new ArrayList<String>(); static List<String> plist = new ArrayList<String>(); static { for (int i = 0; i < english.length; i++) { elist.add(english[i]); plist.add(pinyin[i]); } } public static void main(String[] args) { int flag = 1;//代表正常情况,为0代表输出ERROR Scanner scanner = new Scanner(System.in); String s = scanner.nextLine(); /** * 如果输入全是小写字母直接报错 */ if(s.matches("[a-z]{1,}")){ flag = 0; } String s1 = s.replaceAll("[A-Z]", " $0");// 正则替换注意“ $0”前面有个空格 String[] split = s1.split(" "); String[] split2 = new String[split.length - 1]; System.arraycopy(split, 1, split2, 0, split2.length);//因为split切分完多出了一个空的字符(首位),现在把它去掉 try { for (int i = 0; i < split2.length; i++) { if(elist.contains(split2[i])){ int index = elist.indexOf(split2[i]); split2[i] = split2[i].replace(split2[i], plist.get(index)); }else if(plist.contains(split2[i])){ int index = plist.indexOf(split2[i]); split2[i] = split2[i].replace(split2[i], elist.get(index)); }else if (split2[i].equals("Double")) { split2[i] = split2[i + 1]; if(elist.contains(split2[i])){ int index = elist.indexOf(split2[i]); split2[i] = split2[i].replace(split2[i], plist.get(index)); }else if(plist.contains(split2[i])){ int index = plist.indexOf(split2[i]); split2[i] = split2[i].replace(split2[i], elist.get(index)); }else{ /** * 出现DoubleDouble的情况 */ flag = 0; } }else{ flag = 0; } } } catch (Exception e) { /** * 抛出异常是因为有一种只出现Double的情况 */ flag = 0; } /** * 这里通过set的个数进行判断,因为最后只能出现要么都是英语,要么都是拼音,两者一旦混合出现就不对了 */ Set<Integer> set = new HashSet<Integer>(); for (int i = 0; i < split2.length; i++) { set.add(judge(split2[i])); } if(set.size() > 1){ flag = 0; } StringBuilder sb = new StringBuilder(""); if(flag == 1){ for (int j = 0; j < split2.length; j++) { sb.append(split2[j]); } }else{ sb.append("ERROR"); } System.out.println(sb.toString()); } /** * 判断一个字符串是属于英语数字还是拼音数字还是什么也不是 * @param string * @return 英语数字返回0,拼音数字返回1,否则返回-1 */ public static int judge(String string){ int ret = -1; if(elist.contains(string)){ ret = 0; }else if(elist.contains(string)){ ret = 1; } return ret; } }
正则表达式中$1,$2...是表示的小括号里的内容 $1是第一个小括号里的 ,$2是第2个小括号里的 比如 /gai([\w]+?)over([\d]+)/ 匹配 gainover123 $1= 括号里的 n $2= 第2个括号里的 123,$0表示所有。
相关文章推荐
- 华为2017年8月30日校招编程真题01-数字的中文拼音和英文单词之间互相转换
- 算法题之三道2016华为校招上机笔试题
- 中文转换为完整拼音算法原理分析
- 【算法】华为笔试_颠倒相加_掷骰子
- 笔试算法题(07):还原后序遍历数组 & 半翻转英文句段
- [算法]华为笔试题——字母和十进制数映射
- 华为笔试 数字转中文拼音
- 算法题--阿拉伯数字转换成英文数字
- 笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素
- 笔试算法题(12):整数的string到int转换 & 两个栈实现队列
- 算法:根据手机键盘结果将拼音字符串转换成号码串
- 华为2013校园招聘上机笔试题--字串转换
- 偶见一道华为笔试题(简单的题更显算法啊--不可忽视的数学)
- 中文转换为完整拼音算法原理分析
- C#中文转换成拼音英文
- 华为2013校园招聘上机笔试题-整数转换成字符串
- 阿拉伯数字转换英文数字表示算法解析及其实现
- 中文转换为完整拼音算法原理分析
- C#实现将汉字与英文字符混和字符串中的汉字转换为拼音
- 笔试算法题(31):将有序数组转换成BST表示 & 线段树的应用