题目:405.数字转换为16进制

题目来源:

        leetcode题目,网址:405. 数字转换为十六进制数 - 力扣(LeetCode)

解题思路:

        首先判断所给数字是否为 0 或者 -2147483648(-2^32),若为 0 返回 "0" ,若为-2147483648(-2^32),返回 "80000000"。接着获得所给数字的绝对值,将其转化为16进制。然后判断所给数字是否大于 0 , 若大于 0 ,则直接返回,否则将 16 进制对应二级制按位取反后加一,按要求返回(8位16进制,前面补f)。

解题代码:

class Solution {
    public String toHex(int num) {
        int fabNum=0;
        if(num==0)
            return "0";
        else if(num==-2147483648)
            return "80000000";
        else    
            fabNum=num>0?num:((-1)*num);
        StringBuffer positiveRes=new StringBuffer();
        while(fabNum!=0){
            int remainder=fabNum%16;
            fabNum=fabNum/16;
            positiveRes.insert(0,changeRemainderToHex(remainder));
        }
        if(num>0)
            return positiveRes.toString();
        StringBuffer negativeRes=new StringBuffer();
        //按位取反
        for(int i=0;i<positiveRes.length();i++){
            negativeRes.append(binaryNegation(positiveRes.charAt(i)));
        }
        //加一
        int i=negativeRes.length()-1;
        char newchar=addOne(negativeRes.charAt(i));
        negativeRes.setCharAt(i,newchar);
        int carry=0;
        if(newchar=='0')
            carry=1;
        i--;
        while(carry==1 && i>=0){
            newchar=addOne(negativeRes.charAt(i));
            negativeRes.setCharAt(i,newchar);
            if(newchar=='0')
                carry=1;
            else
                carry=0;
            i--;
        } 
        //修改格式,前面补f
        while(negativeRes.length()<8){
            negativeRes.insert(0,'f');
        }
        return negativeRes.toString();
    }
    public static char addOne(char c){
        switch(c){
            case '0': return '1';
            case '1': return '2';
            case '2': return '3';
            case '3': return '4';
            case '4': return '5';
            case '5': return '6';
            case '6': return '7';
            case '7': return '8';
            case '8': return '9';
            case '9': return 'a';
            case 'a': return 'b';
            case 'b': return 'c';
            case 'c': return 'd';
            case 'd': return 'e';
            case 'e': return 'f';
            case 'f': return '0';
        }
        return ' ';
    }

    public static char binaryNegation(char c){
        switch(c){
            case '0': return 'f';
            case '1': return 'e';
            case '2': return 'd';
            case '3': return 'c';
            case '4': return 'b';
            case '5': return 'a';
            case '6': return '9';
            case '7': return '8';
            case '8': return '7';
            case '9': return '6';
            case 'a': return '5';
            case 'b': return '4';
            case 'c': return '3';
            case 'd': return '2';
            case 'e': return '1';
            case 'f': return '0';
        }
        return ' ';
    }

    public static String changeRemainderToHex(int num){
        if(num<10){
            return Integer.toString(num);
        }else{
            switch(num){
                case 10:
                    return "a";
                case 11:
                    return "b";
                case 12:
                    return "c";
                case 13:
                    return "d";
                case 14:
                    return "e";
                case 15:
                    return "f";
            }
        }
        return "";
    }
}
 

总结:

       首先是 -2147483648(-2^32),要不是提交报错,我还不知道使用int类型计算(-1)* (-2147483648)时,结果仍然是-2147483648。接着是思路,可以直接转换为 2 进制处理后再转换为16进制,题目中只说了不能用转化16进制的库函数,没说不能用转化为2进制的库函数。最后是代码,在整数和16进制数转换时,可以利用数组存放对应关系,这样无论是加一还是取反,直接按规律(加一,取 i+1 ;取反,取 15-i )取数就行了,switch case 太多,无必要。

        官方题解使用的是位运算,代码就16行,比我的(110行)少了好多,还是对位运算不熟悉呀......


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值