504. 七进制数

152 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

一、题目描述:

504. 七进制数 - 力扣(LeetCode)

给定一个整数 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();
    }
};

四、总结:

官方的题解是倒推 + 迭代,感兴趣的也可以区研究下,一堆的公式证明。

  1. 进制范围处理
  2. 数值范围使用数组处理,使用整型表示的数字,java 中的负数最小是 - 2^31,也就是 31 位数字+1 位符号,其他进制位数只减少,不增加,所以 33 位字符足够
  3. 把数字都尽量转换成负数(因为负数多一个,不会因为取反溢出)
  4. 短除法过程少算一位进制数(最后一位不算) ,循环外再补充,防止最后一位是 0
  5. 负数符号拼接与切割

范文参考:

API妙用 【504.七进制数】 by海盗小泽 - 七进制数 - 力扣(LeetCode)