日期:2014-05-20  浏览次数:21008 次

求助一个算法题
今天笔试做的一个算法题,当时觉得很容易,结果越写越复杂,还求助一下各位网友给个答案。
题目是我映像中写下来的。
从控制台输入一个字符串,要求返回其二进制数。输入的数当成十六进制数处理,如输入3A,返回111010,输入17返回10001。如果输入的字符串不合法则提示错误,当然,要区分是因为输入的字符串是不能组成十六进制数的错误还是输入的数超过了范围的错误。

------解决方案--------------------
Integer.parseInt(str,16);
------解决方案--------------------
Integer.toBinaryString(Integer.parseInt(str,16));
------解决方案--------------------

public String getBinaryStr() {
    Scanner sc = new Scanner(System.in);
    System.out.println("Please input the hex number");
    String input = sc.next();
    while (input == null 
------解决方案--------------------
 input == "") {
        input = sc.next();
    }
    sc.close();
    String regex = "[1-9A-F][0-9A-F]*";
    // 不是很理解“要区分是因为输入的字符串是不能组成十六进制数的错误还是输入的数超过了范围的错误”
    // 输入不合格统一按非法处理
    if (!input.toUpperCase().matches(regex)) {
        return "Your input is illegal";
    }
    int tenRadix = Integer.parseInt(input, 16);
    String twoRadix = Integer.toBinaryString(tenRadix);
    return twoRadix;
}


欢迎探讨学习 
------解决方案--------------------
这边有个想法,纸上谈兵一下:
1. 初始化一个Map<String,String>,0~9、A(a)~F(f)为key,0000~1001、1010~1111为value(16进制对应的2进制)
2. 入参解析,可以将字符串拆分成一个个单个字符的字符串,用Map一个个取对应value,也可以考虑用正则表达式匹配
3. 按位转换为2进制(16进制与2进制存在天然的转换关系:一个16进制,4位2进制),直接字符串拼接即可
------解决方案--------------------
用正则是必然的,但用Integer.parseInt(str,16); 函数,这道题立马就0分了;面试过程中(一定要理解出题者的意图,不能盲目的调用库函数,包括sort、binarySearch等等,不然就等着被pass),进制转换没有捷径,循环+栈是唯一的办法
------解决方案--------------------
这种笔试题就看考官的意图了。
可能是以下几种:
1、就是考算法,让你自己实现;
2、考你javaAPI的熟练程度;
3、考你思维严谨度,比如边界值,收入输出,异常处理等,这时候用什么实现估计就不关心了。
------解决方案--------------------
引用:
这边有个想法,纸上谈兵一下:
1. 初始化一个Map<String,String>,0~9、A(a)~F(f)为key,0000~1001、1010~1111为value(16进制对应的2进制)
2. 入参解析,可以将字符串拆分成一个个单个字符的字符串,用Map一个个取对应value,也可以考虑用正则表达式匹配
3. 按位转换为2进制(16进制与2进制存在天然的转换关系:一个16进制,4位2进制),直接字符串拼接即可

如果算法题目 类似于版主的这种做法估计好点。
------解决方案--------------------
引用:
Quote: 引用:

这边有个想法,纸上谈兵一下:
1. 初始化一个Map<String,String>,0~9、A(a)~F(f)为key,0000~1001、1010~1111为value(16进制对应的2进制)
2. 入参解析,可以将字符串拆分成一个个单个字符的字符串,用Map一个个取对应value,也可以考虑用正则表达式匹配
3. 按位转换为2进制(16进制与2进制存在天然的转换关系:一个16进制,4位2进制),直接字符串拼接即可

如果算法题目 类似于版主的这种做法估计好点。

如果不考API的话,楼主的方法很快的,这个问题的主要点还在不能组成十六进制数的错误还是输入的数超过了范围的错误。输入的数操作用正则表达式就可以,超过的范围自己判断一下,16进制最多8位,就可以判断范围了吧?
------解决方案--------------------
参照版主的思路写了一个,注意输出的时候要去掉多余的0.


import java.util.HashMap;

/**
 * 从控制台输入一个字符串,要求返回其二进制数。输入的数当成十六进制数处理,如输入3A,返回111010,输入17返回10001。
 * 如果输入的字符串不合法则提示错误,当然,要区分是因为输入的字符串是不能组成十六进制数的错误还是输入的数超过了范围的错误。
 * 
 * 
 */
public class Test019 {

final static HashMap<Character, String> BINARY_CODE_MAP = new HashMap<Character, String>();

static {
BINARY_CODE_MAP.put('0', "0000");
BINARY_CODE_MAP.put('1', "0001");
BINARY_CODE_MAP.put('2', "0010");
BINARY_CODE_MAP.put('3', "0011");
BINARY_CODE_MAP.put('4', "0100");
BINARY_CODE_MAP.put('5', "0101");
BINARY_CODE_MAP.put('6', "0110");
BINARY_CODE_MAP.put('7', "0111");
BINARY_CODE_MAP.put('8', "1000");
BINARY_CODE_MAP.put('9', "1001");
BINARY_CODE_MAP.put('A', "1010");
BINARY_CODE_MAP.put('B', "1011");
BINARY_CODE_MAP.put('C', "1100");
BINARY_CODE_MAP.put('D', "1101");
BINARY_CODE_MAP.put('E', "1110");
BINARY_CODE_MAP.put('F', "1111");
BINARY_CODE_MAP.put('a', "1010");
BINARY_CODE_MAP.put('b', "1011");
BINARY_CODE_MAP.put('c', "1100");