本题是要将十六进制的字符串转换成十进制。看到题目第一眼就想到用map进行十六进制和十进制的映射。
然后我们需要注意,字符串前面会有0X,这只是一个标识十六进制的标识符,没有具体数字意义,我们在转换的时候,需要把它去掉。
然后我们需要知道,要想把十六进制转换成十进制,我们有递推公式
res = resBASE+map.get(ch)
在这里res初始为0,BASE=16。比如,我们把1A转换成十进制应该是26。按照公式来推,res = 016+1=1 然后res = 1*16+10=26。
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
private final static int BASE = 16;
private static Map<Character, Integer> map = new HashMap<Character, Integer>() {
{
put('0', 0);
put('1', 1);
put('2', 2);
put('3', 3);
put('4', 4);
put('5', 5);
put('6', 6);
put('7', 7);
put('8', 8);
put('9', 9);
put('A', 10);
put('B', 11);
put('C', 12);
put('D', 13);
put('E', 14);
put('F', 15);
put('a', 10);
put('b', 11);
put('c', 12);
put('d', 13);
put('e', 14);
put('f', 15);
}
};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String number = sc.nextLine();
int res = getDecimal(number.substring(2));
System.out.println(res);
}
}
public static int getDecimal(String number){
int res = 0;
for(char ch:number.toCharArray()){
res = res*BASE+map.get(ch);
}
return res;
}
}
注意:
题中map集合的写法被称为双重大括号初始化(Double Brace Initialization)的Java写法。这种写法使用了实例初始化块,它允许在创建对象时进行额外的初始化操作。
next() 与 nextLine() 区别
next():
1、一定要读取到有效字符后才可以结束输入。
2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next() 不能得到带有空格的字符串。
nextLine():
1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
2、可以获得空白。