leetcode 算法题405 (简单100) 数字转换为十六进制数
- 题目介绍
给定一个整数,编写一个算法将这个数转换为十六进制数。
对于负整数,我们通常使用 补码运算 方法。
- 注意
十六进制中所有字母(a-f)都必须是小写。
十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符’0’来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。
给定的数确保在32位有符号整数范围内。
不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
- 示例
输入: 26
输出: “1a”
输入: -1
输出: “ffffffff”
- 解法一
/**
* @param {number} num
* @return {string}
*/
var toHex = function(num) {
let dict = '0123456789abcdef', hex = '';
if(num >= 0) {
while(num > 15) {
hex = dict[num % 16] + hex;
num = (num - num % 16 ) / 16;
}
return dict[num % 16] + hex;
}
num = num * -1;
while(num > 1) {
hex = dict[num % 2] + hex;
num = (num - num % 2 ) / 2;
}
hex = dict[num % 2] + hex;
hex = hex.padStart(32, '0');
let i = 0, radix = '', complement = '', flag = '1';
while(i < hex.length) {
radix += (hex[i++] === '0' ? '1' : '0');
}
i = radix.length - 1;
while(i >= 0) {
if(flag === '1') {
if(radix[i] === '1') {
complement = '0' + complement;
} else {
complement = '1' + complement;
flag = '0'
}
} else {
complement = radix[i] + complement;
}
i--;
}
i = 0;
hex = '';
while(i < 8) {
hex += getHexString(complement.substr(i++ * 4, 4));
}
return hex;
};
const getHexString = str => {
return {
'0000': '0',
'0001': '1',
'0010': '2',
'0011': '3',
'0100': '4',
'0101': '5',
'0110': '6',
'0111': '7',
'1000': '8',
'1001': '9',
'1010': 'a',
'1011': 'b',
'1100': 'c',
'1101': 'd',
'1110': 'e',
'1111': 'f',
}[str];
}
执行用时 : 76 ms, 在所有 JavaScript 提交中击败了77.19%的用户
内存消耗 : 33.9 MB, 在所有 JavaScript 提交中击败了6.06%的用户
- 解法二
/**
* @param {number} num
* @return {string}
*/
var toHex = function(num) {
let i = 0, hex = '', dict = '0123456789abcdef';
if(num === 0) {
return '0';
}
if(num > 0) {
while(num) {
hex = dict[num & 0xf] + hex;
num = num >> 4;
}
return hex;
}
while(i < 8) {
hex = dict[num & 0xf] + hex;
num = num >> 4;
i++;
}
return hex;
}
执行用时 : 68 ms, 在所有 JavaScript 提交中击败了96.49%的用户
内存消耗 : 33.7 MB, 在所有 JavaScript 提交中击败了12.12%的用户