本文以Integer
为例。需要注意的点:
- 正负数处理
- 越界,
Integer.MAX_VALUE
为2147483647,Integer.MIN_VALUE
为-2147483648。正数的容量比负数小1(因为正数包括0),所以计算的时候得使用负数计算,如果是正数再取反 - 对每一位转换的时候考虑范围必须在进制之内
package demo;
public class Solution {
public static void main(String[] args) {
int input = 1245;
int radix = 16;
String numStr = Integer.toHexString(input);
System.out.println("result: " + solution(numStr, radix));
System.out.println("original int: " + input);
System.out.println("original numStr: " + numStr);
}
private static int solution(String numStr, int radix) {
if (numStr == null || numStr.length() == 0) {
throw new NumberFormatException();
}
if (radix < 2) {
throw new IllegalArgumentException("进制不能小于2");
}
boolean negative = false;
if (numStr.startsWith("-")) {
negative = true;
numStr = numStr.substring(1);
} else if (numStr.startsWith("+")) {
numStr = numStr.substring(1);
}
int res = 0;
for (int i = 0; i < numStr.length(); i++) {
char c = numStr.charAt(i);
//为0的位不用计算
if (c == '0') {
continue;
}
int temp = char2Int(c, radix);
//正数的容量比负数小1,使用负数计算
res -= temp * Math.pow(radix, numStr.length() - 1 - i);
}
return negative ? res : -res;
}
private static int char2Int(char c, int radix) {
int charInt = Character.digit(c, radix);
if (charInt >= radix || charInt < 0) {
throw new NumberFormatException("输入的字符串不是数字");
}
return charInt;
}
}
输出结果:
result: 1245
original int: 1245
original numStr: 4dd