本题是要将十六进制的字符串转换成十进制。看到题目第一眼就想到用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、可以获得空白。