华为机试-HJ5 进制转换

498 阅读2分钟

题目

image.png

www.nowcoder.com/practice/8f…

我的题解:

没有爆发出灵感、被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;
  }

image.png

总结:

1、0xAA 其中0X只是表示16进制、AA才是具体的值

2、number.substring(2) 表示左闭右开 第3个元素到最后一个元素

3、这种读入数据的方式

Scanner in = new Scanner(System.in); 
while (in.hasNext()) { 
    String number = in.next();
}

image.png

4、res = res * 16 + map.get(ch); 这个计算的方式是真的牛

5、Java Map初始化的几种方法

优化一下:

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);
        }
    }
}

image.png

总结:

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);
        }
    }
}

image.png

总结:

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); 
}