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

原创 2014年03月10日 00:12:33

一、题目

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




相关文章推荐

已知:yi er san si wu liu qi ba jiu 分别对应123456789, 对一段只含有这几种字符串的字符串进行转换

功能描述:已知:yi er san si wu liu qi ba jiu 分别对应123456789, 对一段只含有这几种字符串的字符串进行转换,如:  输入:yiersansan 输出:1233...

已知:yi er san si wu liu qi ba jiu 分别对应123456789,对一段只含有这几种字符的字符串进行转 换,转换成相应的数字

16.已知:yi er san si wu liu qi ba jiu 分别对应123456789,对一段只含有这几种字符的字符串进行转 换,转换成相应的数字 如:yiersansan:1233 ...

已知:yi er san si wu liu qi ba jiu 分别对应 123456789,对一段只含 有这几种字符的字符串进行转换,转换成相应的数字

#include #include using namespace std; char* ss[9] = {"yi", "er","san","si", "wu", "liu", "qi", "b...

wei wu er yu zi ti shu ru fa

  • 2011年04月30日 22:31
  • 33KB
  • 下载

结束已知应用程序名的进程Demo

  • 2010年11月24日 20:14
  • 44KB
  • 下载

试题:用123456789和+-*/组合出100

#include using namespace std; struct MyException { }; double Plus(double first, double s...

SI Object Browser ER 3

  • 2007年08月16日 19:44
  • 4.92MB
  • 下载

已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做

#include //compare.cpp #include "Node.h" #include "SimpleLinkList.h" using namespace std; template ...

[面试题] 已知比例,找出数组中出现较多的元素

问题摘自《编程之美》。问题1:一个无序数组中某一个元素A的出现次数大于总数的1/2,如何找到它?问题2:一个无序数组中,如果有三个元素A、B、C的出现次数都大于总数的1/4,如何找到它们? 答案1:a...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:华为机试题---已知:yi er san si wu liu qi ba jiu 分别对应123456789
举报原因:
原因补充:

(最多只允许输入30个字)