• 华为笔试练习题----解析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.

  • 相关阅读:
    倍增算法2(树上倍增)
    倍增算法1
    可持久线段树
    【BZOJ】1059: [ZJOI2007]矩阵游戏(二分图匹配)
    【BZOJ】2743: [HEOI2012]采花(树状数组)
    【BZOJ】2959: 长跑(lct+缩点)(暂时弃坑)
    【学习笔记】LCT link cut tree
    【学习笔记】FFT
    【BZOJ】1001: [BeiJing2006]狼抓兔子(最小割 / 对偶图)
    【BZOJ】1007: [HNOI2008]水平可见直线(凸包)
  • 原文地址:https://www.cnblogs.com/Eunice-mogu/p/3949914.html
Copyright © 2020-2023  润新知