题目来源:
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行)少了好多,还是对位运算不熟悉呀......