华为笔试练习题----解析9进制,11进制的字符串为10进制的数字输出

                                                                              解析9进制,11进制的字符串为10进制的数字输出
描述:

解析9进制,11进制的字符串为10进制的数字输出,输入的字符串有效位(0v0012345678)长度不超过8位,前面的00不算做有效位。解析后以10进制的数字输出。
如果解析到非法字符串则返回-1 

9进制:
 9进制的数的范围:0,1,2,3,4,5,6,7,8
 9进制的开始为:0V或者0v
 9进制的正确实例:0V11 0v564 0V123 0v0784 0V0 0v 0V
 9进制的错误实例:0V923 0vt12 00V21 0123 
 9进制转换为10进制:0V11 -> 10
        0v564 -> 463
 
 11进制:
 11进制的数的范围:0,1,2,3,4,5,6,7,8,9,A(a)
 11进制的开始为:0W或者0w
 11进制的正确实例:0W11 0w564 0W123 0w0A8a 0W 0w
 11进制的错误实例:0WB923 0wVaA 00W21 0WAx123 
 11进制转换为10进制:
        0W11 -> 12
        0w564 -> 675

运行时间限制: 无限制
内存限制: 无限制
输入:

 输入为一行9进制或11进制的字符串,格式如上述

输出:

 输出为10进制的数字

样例输入:
0w564
样例输出:
675
答案提示:
 

这道题我是java实现的,因为9进制和11进制的字符串都有一定的规律,所以,想到用正则表达式来进行匹配。9进制的正则表达式为^0[v|V][0-8]*$,11进制的正则表达式为^0[w|W][0-9|a|A]*$。当输入的字符串符合其中的形式则进行解析,否则输入-1。

代码实现:

import java.util.Scanner;  
import java.util.regex.Pattern;  
  
public class Main {  
      
    public int charge(String num){  
        int res=0;  
        String reg1 = "^0[v|V][0-8]*$";  
        String reg2 = "^0[w|W][0-9|a|A]*$";  
        char sub[];  
        if(Pattern.matches(reg1, num)){  
            sub = num.substring(2).toCharArray();  
            for(int i = 0;i< sub.length; i++){  
                int count =Integer.parseInt(String.valueOf(sub[i]));;  
                res += count * Math.pow(9, sub.length-i-1);  
            }  
            return res;  
        }else if(Pattern.matches(reg2, num)){  
            sub = num.substring(2).toCharArray();  
            for(int i = 0;i< sub.length; i++){  
                if(sub[i]=='a'||sub[i]=='A'){  
                  res += 11 * Math.pow(11, sub.length-i-1);  
                }else {  
                  int count = Integer.parseInt(String.valueOf(sub[i]));  
                  res += count * Math.pow(11, sub.length-i-1);  
                }  
            }  
            return res;  
        }  
        return -1;  
    }  
    public static void main(String[] args) {  
            Scanner cin = new Scanner(System.in);  
            Main main = new Main();  
            String m;  
            while (cin.hasNext()){  
                m = cin.next();   
                System.out.println(main.charge(m));  
            }  

此代码在IDE下运行是没有问题的,但在华为的测试坏境下,有一个测试用例没有通过,因为测试用例是不公开的,所以我暂没找到原因,希望网友能帮忙找下bug.

posted @ 2014-09-01 19:56  Eunice1314  阅读(1049)  评论(0编辑  收藏  举报