该贴原因:
今日有幸看到uuwatch面试题:大概意思就是将日常中人民币的大写转换成阿拉伯数字表示,不记小数点,同时需要考虑效率,因为该方法需要执行100万次。
1、实现该代码(代码效率可能欠佳,望看到的同仁提出更高效率的算法)
package wzf.learn.excelDemo1.test;
import java.util.HashMap;
import java.util.Map;
public class RMB2Num {
private static Map<String,String> chineseMap = new HashMap<String,String>();
static {
chineseMap.put("壹", "1");
chineseMap.put("贰", "2");
chineseMap.put("叁", "3");
chineseMap.put("肆", "4");
chineseMap.put("伍", "5");
chineseMap.put("陆", "6");
chineseMap.put("柒", "7");
chineseMap.put("捌", "8");
chineseMap.put("玖", "9");
chineseMap.put("零", "");
chineseMap.put("亿", "100000000");
chineseMap.put("万", "10000");
chineseMap.put("仟", "1000");
chineseMap.put("佰", "100");
chineseMap.put("拾", "10");
chineseMap.put("圆", "");
chineseMap.put("整", "");
}
public long change1(String rmb){
long retStr = 0L ;
//先看里面是否包含亿
if(rmb.contains("亿")){
retStr = retStr + yi(rmb.substring(0, rmb.indexOf("亿"))) * Long.valueOf(chineseMap.get("亿"));
}
先看里面是否包含万
int indexwan = 0;
rmb = rmb.substring(0, rmb.indexOf("亿"));
if(rmb.contains("万")){
indexwan = rmb.indexOf("万");
retStr = retStr + wan(rmb.substring(1, rmb.indexOf("万"))) * Long.valueOf(chineseMap.get("万"));
}
//截取万后面的
retStr = retStr + qian(rmb.substring(indexwan+1, rmb.length() ));
return retStr;
}
public long yi(String yi){
long ret = 0l;
int indexwan = 0;
if(yi.contains("万")){
indexwan =yi.indexOf("万");
ret = ret + wan(yi.substring(1, yi.indexOf("万"))) * Long.valueOf(chineseMap.get("万"));
}
ret = ret + qian(yi.substring(indexwan+1, yi.length()));
return ret;
}
public long wan(String wan){
return qian(wan.substring(0, wan.length()));
}
//万以后的
public long qian(String qian){
long retStr = 0l;
String segument = "";
for (int i = 0; i < qian.length(); i++) {
String temp = qian.substring(i,i+1);
if("仟".equalsIgnoreCase(temp)){
retStr = retStr + Long.valueOf(segument.equals("")?"1":segument)*Long.valueOf(chineseMap.get(temp)) ;
segument = "";
}else if("佰".equalsIgnoreCase(temp)){
retStr = retStr + Long.valueOf(segument.equals("")?"1":segument)*Long.valueOf(chineseMap.get(temp)) ;
segument = "";
}else if("拾".equalsIgnoreCase(temp)){
retStr = retStr + Long.valueOf(segument.equals("")?"1":segument)*Long.valueOf(chineseMap.get(temp)) ;
segument = "";
}else{
segument = segument + chineseMap.get(temp);
}
}
if(segument.length() > 0){
retStr = retStr + Long.valueOf(segument);
}
return retStr;
}
public static void main(String[] args) {
RMB2Num rmb = new RMB2Num();
System.out.println(rmb.qian("壹仟零叁圆整"));
System.out.println(rmb.change1("壹佰万零叁拾亿柒仟捌佰零玖万壹仟零叁圆整"));
}
}
2、需要写三个测试用例
3、写出测试用例的关键点