华为机试题---已知: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




与数字相关转换(包括英文和汉语拼音)

数字到英文描述的转换1.给定一个整数,打印该整数的对应的英文描述,例如输入1234,输出“One Thousand,Two Hundred Thirty Four”解题思路:例如在转换19323984...
  • u012260238
  • u012260238
  • 2015-09-13 21:25:31
  • 1698

已知: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...
  • xie294777315
  • xie294777315
  • 2014-04-12 16:51:30
  • 937

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

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

面试题06:一串英文数字转换成阿拉伯数字

已知:zero,one,two,three,four,five,six,seven,eight,nine分别对应0,1,2,3,4,5,6,7,8,9,对每一段含有这几种字符串的字符串进行转换,如: ...
  • qq_32801733
  • qq_32801733
  • 2017-09-21 16:02:24
  • 456

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

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

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

一、题目 * 功能描述:已知:yi er san si wu liu qi ba jiu 分别对应123456789, 对一段只含有这几种字符串的字符串进行转换,如:  * 输入:yiersans...
  • sxb0841901116
  • sxb0841901116
  • 2014-03-10 00:12:33
  • 1840

输入一个字符串,将其各个字符对应的ASCII值加5后,输出结果。

程序实现目标:输入一个字符串,将其各个字符对应的ASCII值加5后,输出结果。  程序要求:该字符串只包含小写字母,若其值加5后的字符值大于'z',将其转换成从a开始的字符。 //实现im...
  • u011445269
  • u011445269
  • 2014-07-03 16:55:06
  • 2697

yi er san si wu liu qi ba jiu 分别对应123456789

public static String trunNumber(String data) { char[] charArray = data.toCharArray(); Str...
  • jingzhi1230
  • jingzhi1230
  • 2017-12-28 10:33:46
  • 119

华为机试-拼音翻译成阿拉伯数字

题目描述: 输入一串拼音,输出它代表的阿拉伯数字(Ling,Yi,Er,San,Si,Wu,Liu,Qi,Ba,Jiu),数字不会超过十万 为了处理方便,输入一定是只有数字拼音的,没有其他...
  • zhaoqingtao007
  • zhaoqingtao007
  • 2015-05-05 21:00:33
  • 640

Hibernate映射文件(Entity.hbm.xml)

Hibernate映射文件配置
  • jingzhi1230
  • jingzhi1230
  • 2017-08-02 11:36:33
  • 544
收藏助手
不良信息举报
您举报文章:华为机试题---已知:yi er san si wu liu qi ba jiu 分别对应123456789
举报原因:
原因补充:

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