将汉字转换成数字

这是google的一道面试题.

将汉字转换成数字, 如下
一          1
十          10
十一        11
二十        20
二十一      21
一百        100
一百零一    101
一百一十    110
一百一十一  111

当然算法要能将所有的汉字数字转换成阿拉伯数字,同时兼顾性能.

 

 

 

 

 

 

 

 

 

 

 

 

 

public class MyTest{
   
private static final String[] hz = {"","","","","","","","","",""};
   
private static final Map<String, Integer> hzsz = new HashMap<String, Integer>();
   
private static final Map<String, Integer> hzradix = new HashMap<String, Integer>();
   
   
static{
       
for(int i = 0; i < hz.length; i ++){
            hzsz.put(hz[i], i);
        }
        hzradix.put(
"", 10);
        hzradix.put(
"", 100);
        hzradix.put(
"", 1000);
        hzradix.put(
"", 10000);
        hzradix.put(
"亿", 100000000);
    }
   
   
public static void main(String[] args){
        String[] srcs
= {"","","十一","二十","二十一",
                        
"一百","一百零一","一百一十","一百一十一",
                        
"五十亿三千零七十五万零六百二十二",
                        
"十三亿三千零十五万零三百一十二"};
       
for(int i = 0; i < srcs.length; i ++){
            System.out.println(exchange1(srcs[i]));
        }
    }
   
   
public static long exchange1(String src){
        String []tmp1
= src.split("亿");
       
if(tmp1.length == 2){
           
return (long)exchange2(tmp1[0]) * hzradix.get("亿") + exchange2(tmp1[1]);
        }
else{
           
return exchange2(tmp1[0]);
        }
    }
   
   
public static int exchange2(String src){
        String []tmp1
= src.split("");
       
if(tmp1.length == 2){
           
return exchange(tmp1[0]) * hzradix.get("") + exchange(tmp1[1]);
        }
else{
           
return exchange(tmp1[0]);
        }
    }
   
   
public static int exchange(String src){//十、百、千
        int bg = 0;
       
for(int i = 0; i < src.length(); i ++){
            String c1
= ""+src.charAt(i);
           
if(hzsz.containsKey(c1)){
               
if(c1.equals("")){
                   
continue;
                }
               
if(i + 1 < src.length()){
                    String c2
= ""+src.charAt(i+1);
                   
if(hzradix.containsKey(c2)){
                        bg
+= hzsz.get(c1) * hzradix.get(c2);
                    }
                }
else{
                    bg
+= hzsz.get(c1);
                }
            }
else if(i == 0 && c1.equals("") ||//10-19之间的习惯用法
                     i > 0 && c1.equals("") && ((""+src.charAt(i-1)).equals(""))){
                bg
+= 10;
            }
        }
       
return bg;
    }
}

 

输出结果:
1
10
11
20
21
100
101
110
111
5030750622
1330150312

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值