一、题目
* 功能描述:已知:yi er san si wu liu qi ba jiu 分别对应123456789, 对一段只含有这几种字符串的字符串进行转换,如:
* 输入:yiersansan 输出:1233
二、思路分析
1. 思路分析
* 首先要解决三个问题:
* 第一、怎么存储常量字符串和数据对应关系。
* 第二、如何分割对于输入的字符串,获得出有数字对应的子字符串。
* 第三、 如何对子字符串进行匹配,寻找下一个。
三、算法分析
* 第一、怎么存储常量字符串和数据对应关系。
* 由于看到是字符串和数字是一一对应,并且都没有重复,故可以想到以下三种存储方式
* 1> 用一维数组,以位置 + 1为数字,内容为字符串。例如String [] arr = {"yi"....}; 然后遍历输入字符串,可以匹配到yi,则为return index + 1;
* 因为数组是从零开始的。
* 2> 用list存储,可以用到list.indexof(object o) 方法,并且可以用contains(object o)进行判断是否存在。
* 3> 用map存储,可以吧map定义为hashMap<String, integer> key为字符串,value为对应数字,但相对而言比前面两者消耗内存要多。
*
* 第二、如何分割对于输入的字符串,获得出有数字对应的子字符串。
* 经过观察输入字符串可以得出两个结论:
* 1>、所有的子字符串的长度不是2就是3
* 2>、子字符串的每个首字符都不同(除了san和si)
* 故可以有两种解决方案:
* 1>、对于输入的字符串,以2或者3的长度进行切分总字符串。例如:string = "yier", subString = string.substring(0,2) = yi
* 2>、利用正则表达式,让整个字符串用[y,e,s..]等进行切分,然后再判断。
*
* 第三、如何对子字符串进行匹配,寻找下一个。
* 对于上面两种切割方式,有以下两种匹配方式:
* 1> 对于第一种方法,主要流程:
* 首先要初始化一个int变量count,用来记录从总字符串上切下来所以字符串的长度(因为substring方法不会改变原来字符串的长度),以方便与总字符串相比较,终止循环条件。
* 其次,用2个长度去切割字符串,如果不匹配,再用3个长度去切割。要用count记录所有切下来字符长度。
* 最后,利用contains方法进行匹配和indexof方法返回对于数据
* 2> 对于第二种方法:
* 首先把字符串根据正则表达式切割为字符串数组
* 其次,在遍历数组的过程中,去匹配和原先已经存好的数据进行匹配。要注意以s的要进行判断是si还是san.
* 这儿也可以用简单方法if else 来做。
* 最后,用字符串把结果串联在一起。
四、核心算法
public String trunNumber(String data) { String result = ""; String str = ""; int dataSize = 0; while (data.length() > dataSize) { str = data.substring(dataSize, dataSize + 2); if (list.contains(str)) { result += String.valueOf(list.indexOf(str) + 1); } else { str = data.substring(dataSize, dataSize + 3); result += String.valueOf(list.indexOf(str) +1); } dataSize += str.length(); } return result; }五、测试类
package com.albertshao.csi.interview; import java.util.ArrayList; import java.util.List; /** * @author albertshao * */ public class Main12 { private static final List<String> list = new ArrayList<String>(); static { list.add("yi"); list.add("er"); list.add("san"); list.add("si"); list.add("wu"); list.add("liu"); list.add("qi"); list.add("jiu"); list.add("ba"); } public static void main(String[] args) { Main12 m = new Main12(); String data = "yiersansan"; System.out.println(m.trunNumber(data)); } public String trunNumber(String data) { String result = ""; String str = ""; int dataSize = 0; while (data.length() > dataSize) { str = data.substring(dataSize, dataSize + 2); if (list.contains(str)) { result += String.valueOf(list.indexOf(str) + 1); } else { str = data.substring(dataSize, dataSize + 3); result += String.valueOf(list.indexOf(str) +1); } dataSize += str.length(); } return result; } }
1233