面试:兴业数金笔试,进制转换

题干

输入一个字符串,该字符串表示一个整数(可正可负)。该整数应该被转换为二进制和十六进制的数,最后用逗号衔接。二进制最多用十六位表示(首位0表示整数,1表示负数),十六进制四位表示。如果整数超过转换结果的限制,输出"NODATA";如果该输入不是一个整数,输出"INPUTERROR"。

分析

  1. 常规做法,整数除数求整、求余数。缺点,十六进制字符太过于麻烦。代码又臭又长。
  2. 取巧,利用Integer静态方法,toBinaryString和toHexString

代码实现

public class Main {
          
   
    public static String changeFormatNumber (String number) {
          
   
        try {
          
   
            int n = Integer.valueOf(number);
            StringBuilder sb = new StringBuilder();
            String binaryS;
            String hexS;
            if(Math.abs(n) > Math.pow(2, 15) - 1){
          
   
                System.out.print("NODATA");
            }else {
          
   
                if(n >= 0){
          
   
                    return calculatePositiveNum(n, sb);
                }else {
          
   
                    return sb.append(Integer.toBinaryString(n).substring(16)).append(,).append(Integer.toHexString(n).substring(4).toUpperCase()).toString();
                }
            }
        }catch (NumberFormatException e){
          
   
            System.out.print("INPUTERROR");
        }
        return "";
    }

    static String calculatePositiveNum(int n, StringBuilder sb) {
          
   
        String binaryS;
        String hexS;
        binaryS = Integer.toBinaryString(n);
        for(int i = 0,j = 16 - binaryS.length();i < j;i ++){
          
   
            sb.append(0);
        }
        sb.append(binaryS).append(,);
        hexS = Integer.toHexString(n);
        for(int i = 0,j = 4 - hexS.length();i < j;i ++){
          
   
            sb.append(0);
        }
        sb.append(hexS.toUpperCase());
        return sb.toString();
    }

    public static void main(String[] args) {
          
   
        System.out.println(changeFormatNumber("1322"));
    }
}

最终通过率百分之七十多,不清楚哪里出了问题。。。

经验分享 程序员 微信小程序 职场和发展