405. 数字转换为十六进制数

转载自Leet Code

题目描述

给定一个整数,编写一个算法将这个数转换为十六进制数。

对于负整数,通常使用 补码运算 方法。

注意:

  1. 十六进制中所有字母(a-f)都必须是小写。

  2. 十六进制字符串中不能包含多余的前导零。

    如果要转化的数为0,那么以单个字符'0'来表示;

  3. 给定的数确保在32位有符号整数范围内。

  4. 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

示例1:

输入: paths = [["London","New York"],["New York","Lima"],["Lima","Sao Paulo"]]

输出: "Sao Paulo"

示例2:

输入: paths = [["B","C"],["D","B"],["C","A"]]

输入: 26

输出: "la"

示例2:

输入:-1 输出:"ffffffff"


我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
class MySolution405 {
public static HashMap<Integer, String> mapDH;

public String toHex(int num)
{
mapDH = new HashMap();
mapDH.put(10, "a"); mapDH.put(11, "b"); mapDH.put(12, "c");
mapDH.put(13, "d"); mapDH.put(14, "e"); mapDH.put(15, "f");

if (num==0) return "0";
else if (num>0) return DtoBase(num, 16);
else // num<0
{
String newStr = new String(Integer.toString(num));
if (newStr.equals("-2147483648")) return "80000000";
String biStr = DtoBase(Math.abs(num), 2);
while (biStr.length()<32) biStr = "0"+biStr;

String r_biStr = ""; char []biStrArr = biStr.toCharArray();
for (char ch:biStrArr)
{
String newCh = (ch=='0')?"1":"0";
r_biStr += newCh;
}

r_biStr = AddOne(r_biStr);

return BtoH32(r_biStr);
}
}

public static String DtoBase(int num, int base)
{
StringBuilder sb = new StringBuilder();

while(true)
{
int rem = num%base;
if (rem>=10)
sb.append(mapDH.get(rem));
else
sb.append(rem);

int quo = num/base;
if (quo==0) break;
num = quo;
}

return sb.reverse().toString();
}


public static String AddOne (String biStr)
{
int car = 1; StringBuilder sb = new StringBuilder();

for (int i = biStr.length()-1; i>=0; i--)
{
int vali = biStr.charAt(i)=='0'?0:1;
int sum = vali+car;
int val = sum%2;
sb.append(val);
car = sum/2;
if (car==0&&(i-1)>=0)
{
sb.append(new StringBuilder(biStr.substring(0, i)).reverse().toString());
break;
}
}
return sb.reverse().toString();

}

public static String BtoH32 (String biStr)
{
StringBuilder sb = new StringBuilder();
for (int i=0,j=0; i<8; i++,j+=4)
{
String num = biStr.substring(j,j+4);
int val = 1*(num.charAt(3)=='1'?1:0)+2*(num.charAt(2)=='1'?1:0)+4*(num.charAt(1)=='1'?1:0)+8*(num.charAt(0)=='1'?1:0);
if (val>=10)
sb.append(mapDH.get(val));
else
sb.append(val);
}
return sb.toString();
}
}