字节三面算法题:其他进制数据转换成十进制数据输出

111 阅读2分钟

当时没有在30分钟内做出来,但是思路还是没有变的,结束面试后抽时间完善了一下,解决方案如下:

public class Revert {
    private static final int TYPE_HEX = 0;
    private static final int TYPE_OCT = 1;
    private static final int TYPE_TEN = 2;

    public static int atoi(String value) throws Exception {
        int result;
        if (value == null || value.length() == 0) {
            return -1;
        }
        String operateString;
        //1.正负号不参与输出所以不用考虑
        if (value.startsWith("+") || value.startsWith("-")) {
            operateString = value.substring(1);
        } else {
            operateString = value;
        }
        //2.十六进制数据处理
        if (operateString.startsWith("0x")) {
            String changeString = operateString.substring(2);
            result = revertNumToTen(TYPE_HEX, changeString);
            System.out.println(value+"十六进制数据处理结果:"+result);
        } else if (operateString.startsWith("0")) {
            //3.八进制数据或者只有0处理
            if (operateString.length() == 1) {
                System.out.println(value+"十进制数据0");
                return 0;
            }
            for (int i = 0; i < operateString.length(); i++) {
                if (operateString.charAt(i) > '7') {
                    //属于异常的处理
                    throw new IllegalArgumentException(value+"类型不正确,八进制数字有大于7的数据");
                }
            }
            System.out.println(operateString);
            String changeString = operateString.substring(1);
            result = revertNumToTen(TYPE_OCT, changeString);
            System.out.println(changeString+"八进制数据处理结果:"+result);
        } else {
            //4.十进制或者是字符串中间有字符的
            int startIndex = 'A';
            int endIndex = 'z';
            //异常情况处理
            for (int i = 0; i < operateString.length(); i++) {
                if (operateString.charAt(i) > startIndex && operateString.charAt(i) < endIndex) {
                    //属于异常的处理
                    throw new Exception(value+"类型不正确,数字字符串中间有英文字符" + operateString.charAt(i));
                } else if (operateString.charAt(i) < '0' || operateString.charAt(i) > '9') {
                    throw new Exception(value+"类型不正确,数字字符串内部有非英文字符" + operateString.charAt(i));
                }
            }
            //5.十进制的情况处理
            result = revertNumToTen(TYPE_TEN, operateString);
            System.out.println(value+"十进制数据处理结果:"+result);
        }
        return result;
    }

    public static int revertNumToTen(int type, String changeString) throws IllegalArgumentException {
        if (type == TYPE_HEX) {
            //十六进制
            return hexToTen(changeString);
        } else if (type == TYPE_OCT) {
            //八进制
            return octToTen(changeString);
        } else if (type == TYPE_TEN) {
            //十进制
            int result = Integer.parseInt(changeString);
            return result;
        } else {
            throw new IllegalArgumentException("进制类型不正确");
        }
    }

    private static int hexToTen(String changeString) {
        return Integer.valueOf(changeString,16);
    }

    private static int octToTen(String changeString) {
        System.out.println(changeString);
        return Integer.parseInt(changeString,8);
    }



    public static void main(String[] args) throws Exception {
        try {
            System.out.println(atoi("+1233"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            System.out.println(atoi("0x12fd"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            System.out.println(atoi("+0x12fd"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            System.out.println(atoi("0"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            System.out.println(atoi("012"));
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            System.out.println(atoi("+1233"));
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            System.out.println(atoi("123+123"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            atoi("1230x123");
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            atoi("029");
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            atoi("1123d12");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}