华为机试题---已知:yi er san si wu liu qi ba jiu 分别对应123456789

一、题目

* 功能描述:已知: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




你可能感兴趣的:(华为,机试)