405. Convert a Number to Hexadecimal

。。感觉做的很蠢。

主要就是看负数怎么处理。

举个例子,比如8位:
0111 1111 = 127
1111 1111 = -1
1000 0000 = -128
正常情况1111 1111应该是256,就是最大值127+最小值的绝对值128+1+num

其实点开那个提供的WIKI链接就一目了然了。。

用LONG是怕溢出

public class Solution {
    
    char[] b = new char[16];
    
    public String toHex(int num) 
    {
        if(num == 0) return "0";
        
        long a = 0;
        if(num < 0) 
            a = (long)Integer.MAX_VALUE+(-1)*(long)Integer.MIN_VALUE+num+1;
        else 
            a = (long) num;
        
        
        
        for(int i = 0; i < 10;i++) b[i] = (char)('0'+i);
        b[10] = 'a';
        b[11] = 'b';
        b[12] = 'c';
        b[13] = 'd';
        b[14] = 'e';
        b[15] = 'f';
        
        return helper(a);
        
        
    }
    
    public String helper(long a)
    {
        String res = "";
        while(a >= 16)
        {
             res += helper(a/16);
             a%=16;
        }
        
        return res + b[(int)a];
        
    }
}

二刷。

通刷这个题也卡了,次奥。
看了新的简单的做法。
我们可以把4位4位的来看NUM,因为4位bits代表的就是16进制。
右移要用>>>而不是>>,因为后者会帮你添加符号,而我们恰好不能让它这么做。。因为16禁止最后是没符号的。

public class Solution {
    public String toHex(int num) {
        if(num == 0) return "0";
        
        StringBuilder sb = new StringBuilder();
        char[] digits = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};  // map
        
        
        while(num != 0){
            sb.append(digits[(num & 15)]);
            num = num >>> 4;
        }
        
        return sb.reverse().toString();
        
    }
    
    

}

顺便,cnblog该如何搜搜发过的随笔。。

posted @ 2016-09-26 08:04  哇呀呀..生气啦~  阅读(164)  评论(0编辑  收藏  举报