当时没有在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();
}
}
}