开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情
一、题目描述:
给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。
示例 1:
输入: num = 100
输出: "202"
示例 2:
输入: num = -7
输出: "-10"
提示:
- -10^7 <= num <= 10^7
二、思路分析:
先找到最小的大于 num 的7的幂次,退一步就是最大的不大于 num 的7的幂。那么就找到了num 对应七进制数的位数。
对于 num = 100,先找到最小的大于100的7的幂次即 343,退一步除以7即 49就是最大的不大于100的7的幂次。49 以七进制表示即 100, num的位数与其相等。
然后从高位到低位依次获取每位上的数字即可,不用再对结果进行反转。
btw,注意一些边界条件的处理。
三、AC 代码:
class Solution {
public:
string convertToBase7(int num) {
if(num == 0){
return "0";
}
stringstream res;
if(num < 0){ // 负数特殊处理
num = abs(num);
res << "-";
}
int t = 1; // 底数
while(t <= num){ // 找到最小的大于num的7的幂次
t *= 7;
}
t /= 7; // 退一步,就是最大的不大于num的7的幂次
while(t){ // 从高到低依次获得每位数字
res << num / t; // 当前位加入结果
num %= t;
t /= 7;
}
return res.str();
}
};
四、总结:
官方的题解是倒推 + 迭代,感兴趣的也可以区研究下,一堆的公式证明。
- 进制范围处理
- 数值范围使用数组处理,使用整型表示的数字,java 中的负数最小是 - 2^31,也就是 31 位数字+1 位符号,其他进制位数只减少,不增加,所以 33 位字符足够
- 把数字都尽量转换成负数(因为负数多一个,不会因为取反溢出)
- 短除法过程少算一位进制数(最后一位不算) ,循环外再补充,防止最后一位是 0
- 负数符号拼接与切割