目录
405、数字转化为十六进制
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算方法。
注意:
- 十六进制中所有字母(
a-f
)都必须是小写。 - 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符
'0'
来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。 - 给定的数确保在32位有符号整数范围内。
- 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
示例 1:
输入:26 输出:"1a"
思路:
1、首先,传过来的数有可能等于0、等于0(大于0、小于0)
2、对于等于0的做法,是直接返回 -> 字符“0”
3、对于不等于0中:
若该数为负数,则要先对该数进行处理,需要先在 num基础上加上 2^32的偏移量,再进行进制转换
处理完毕之后,则对该数进行while循环处理:
第一种情况,该值小于10:先对16取余的结果赋给long型变量,再将该long型变量转化成字符;
第一种情况,该值大于等于10:将该long型变量- 10 +'a'
注:创建一个可变字符容器StringBuilder存储数据,可将每次的转化结果存储到容器中,最后调用对象StringBuilder.reverse().toString()方法输出
class Solution {
public String toHex(int num) {
//如果该数等于0
if(num == 0) {
return "0";
}
long num1 = num;
//创建一个可变字符容器StringBuilder存储数据
StringBuilder sb = new StringBuilder();
//如果该数为负数,则需要先在 num基础上加上 2^32的偏移量,再进行进制转换
if(num1 < 0) {
num1 = (long)(Math.pow(2, 32) + num1);
}
//因为上一个if语句已经对复数进行处理,因此下面的while循环包含大于0和小于0的数
while(num1 != 0) {
//该数对16取余
long num2 = num1 % 16;
//对取余的数转化为字符类型(此时的num2包含>=10和<10的
char c = (char)(num2 + '0'); //注意:在转化的时候对类型也要加括号
//当对16取余的num2 >= 10时,要将num2转化为a-f
if(num2 >= 10) {
c = (char)(num2 - 10 +'a');
}
sb.append(c);
//对取余数处理完毕之后,将num1/10的结果再次循环执行
num1 /= 16;
}
return sb.reverse().toString();
}
}
504、七进制数
给定一个整数 num
,将其转化为 7 进制,并以字符串形式输出。
示例 1:
输入: num = 100 输出: "202"
示例 2:
输入: num = -7 输出: "-10"
思路:
转化为为七进制的思路与转化为十六至今的思路大致一致
不同点在于当转化的数为负数时,两者的处理不同
十六进制:先对该数进行处理,需要先在 num基础上加上 2^32的偏移量,再进行进制转换
七进制:先判断该数是否为负数,将结果赋给boolean变量,若为真,则将该数转化为正数在进行进制运算,最后加个“-”即可
class Solution {
public String convertToBase7(int num) {
if (num == 0) {
return "0";
}
StringBuilder sb = new StringBuilder();
//判断num1为整数或负数
boolean result = num < 0;
//若为真(即num < 0),则将num值转化为正数在进行进制运算,最后加个“-”即可
if(result)
num = -num;
while (num != 0) {
long num1 = num % 7;
char c = (char) (num1 + '0');
sb.append(c);
num /= 7;
}
return result ? "-" + sb.reverse().toString() : sb.reverse().toString();
}
}