leetcode算法405. 数字转换为十六进制数

152 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

一、题目描述:

405. 数字转换为十六进制数 - 力扣(LeetCode)

给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。

注意:

  • 十六进制中所有字母(a-f)都必须是小写。
  • 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。 
  • 给定的数确保在32位有符号整数范围内。
  • 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

示例 1:

输入:
26

输出:
"1a"

示例 2:

输入:
-1

输出:
"ffffffff"

二、思路分析:

通过取模的方式获取到数字,然后取定义的cov字符串对应数字下的字符
在设定遍历范围的时候,因为题目规定在32位有符号整数范围内,将二进制划分为4位一组,一组表示一个字符,所以分成8组,遍历8次

三、AC 代码:

package leetcode;

public class Lc405 {
	public String toHex(int num) {

		// 01 check
		if (num == 0)
			return "0";

		// 02 data
		StringBuilder output = new StringBuilder();
		int lowBit = 0x000f;// 15
		char[] mapHex = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
		int n = num;

		// 03 time
		//while (n > 0) {
		while (num !=0) {
			//十进制表示 -->十六进制表示
			System.out.println(Integer.toBinaryString(num));
			int decIndex = n & lowBit; 
			// 疑问:获取的后四位吗?怎么变成整数类型,二进制呢?
			//眼睛看到 就是从内存读取到寄存器数据。自动完成数据转换。
			output.append(mapHex[decIndex]);
			//n = n >>4; //死循环了。
			//num >>>= 4;
			 System.out.println(Integer.toBinaryString(num));
		}
		//O4 bug -1 ;
		//算术右移(>>):有符号的移位操,右移之后左侧的空位正数用0补充,负数用1补充
		//11111111111111111111111111111111 死循环了。
		//逻辑右移(>>>,无符号移位
		
		return output.reverse().toString();

	}
	public static void main(String[] args)
	{       
		   Lc405 lc =new Lc405();
		  // System.out.println(lc.toHex(-5));
		   System.out.println(lc.toHex(-1));
		   //System.out.println(lc.toHex(26));
	}
}


四、参考:

清晰易懂的哈希表解法(击败100%), C++/Python/Java/C#全部实现【大白技术控】 - 数字转换为十六进制数 - 力扣(LeetCode)