LeetCode-504:七进制数

给定一个整数,将其转化为7进制,并以字符串形式输出。

示例 1:
输入: 100
输出: “202”

示例 2:
输入: -7
输出: “-10”

注意: 输入范围是 [-1e7, 1e7] 。

代码实现
C++:

学过计算机原理的小伙伴都应该知道,10进制N到某2进制的转换过程就是:

初始化空序列res;
计算 N % 2 并追加到序列res的开头;
将N/2的商取整作为新的N;
重复第2~3步的操作,直到N等于0;

对于7进制这个步骤是一样的,仅仅需要将上面步骤的2替换为7即可。
关于正整数的转换很简单,按照上面步骤直接循环转换即可。
由于上面步骤0作为临界条件,所以当num为0时要单独处理。
当num为负数时,要先将其转换成正数再处理,符号的追加放最后。

既然说到负数,我想说一个题外话,关于负数的除法:
python和C,java的除法是不同的(这里说的除法都是整数除法,与python的"/"除法无关)。
C和Java的除法是直接截断,丢弃后面的小数部分,所以-6/5==-1 余 -1;
而python在做这个计算的时候,是对结果进行下取整,所以结果是-6//5=-1 余 4。如果还不知道的小伙伴们要注意了。

处理流程说完了,再说说存储的问题。
我们发现在整个转换过程中,res的长度是在不断变化的。理想的情况下,我们期望能动态的改变字符串的长度,但是对于某些语言这么做可能不太方便。
对于C语言来说不断变换字符串的长度会产生额外的开销。
其实一个整数转换成7进制,字符串的长度其实是有限的。当N取32位最小负整数时,算上符号,7进制的长度也仅仅只有13位。因此我们初始化一个长度是14的字符串完全足够了。
在转换的过程中,低位的先产生,再接着产生高位的。在添加高位字符的时候为了避免移动低位字符产生开销,我的方法是从res的倒数第二个位置(字符串应该以’\0’结尾)开始向左追加字符。等待转换完成后修改res的起始指针即可。

class Solution {
public:
    string convertToBase7(int num) {
        string result = "";
        if(num==0){
            return "0";
        }
        else if(num>0){
            while(num!=0){
                //从右向左追加字符,第一个余数永远在最后
                result = to_string(num%7) + result;
                num = int(num/7);
            }
        }
        else{
            //如果是负整数,先取反,最后再结果前面添加负号
            result = "-"+convertToBase7(-num);
        }
        return result;
    }
};

Python:

class Solution(object):
    def convertToBase7(self, num):
        """
        :type num: int
        :rtype: str
        """
        if num > 0:
            if num < 7:
                return str(num)
            return self.convertToBase7(num//7) + str(num%7)
        else:
            return '-'+self.convertToBase7(abs(numm))
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值