题目
我的题解:
没有爆发出灵感、被16进制干扰住了
参考题解
import java.util.*;
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 in = new Scanner(System.in);
while (in.hasNext()) {
String number = in.next();
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;
}
总结:
1、0xAA 其中0X只是表示16进制、AA才是具体的值
2、number.substring(2) 表示左闭右开 第3个元素到最后一个元素
3、这种读入数据的方式
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String number = in.next();
}
4、res = res * 16 + map.get(ch); 这个计算的方式是真的牛
优化一下:
import java.util.*;
import java.io.*;
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) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String number;
while ((number = bf.readLine()) != null) {
int res = 0;
for (char ch : number.substring(2).toCharArray()) {
res = res * BASE + map.get(ch);
}
System.out.println(res);
}
}
}
总结:
1、 BufferedReader就是比Scanner强20ms的优势
高效题解
import java.util.*;
import java.io.*;
public class Main {
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) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String input;
while ((input = bf.readLine()) != null) {
String temp = input.substring(2);
int sum = 0;
int length = temp.length();
for (int i = length - 1; i >= 0; i--) {
char c = temp.charAt(i);
sum = sum + (int)Math.pow(16, length - i - 1) * map.get(c);
}
System.out.println(sum);
}
}
}
总结:
1、sum = sum + (int)Math.pow(16, length - i - 1) * map.get(c); 这是我们小时候常用的换算公式
2、 length - i - 1 这个指针的用法要熟悉、而且脑子里要想象的出来
for (int i = length - 1; i >= 0; i--) {
char c = temp.charAt(i);
sum = sum + (int)Math.pow(16, length - i - 1) * map.get(c);
}