持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
题目
给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。
示例 1:
示例 2:
方法一:倒推 + 迭代
前言
这道题要求返回给定的整数 num 的七进制表示。部分编程语言有自带的方法或函数可以实现该功能,例如 Java 的 Integer.toString。
面试的时候,面试官不会允许直接调用编程语言自带的方法或函数实现进制转换,而是期望看到面试者自行实现进制转换的过程。
以下是使用 Integer.toString 实现进制转换的代码,由于不适合在面试中使用,因此不具体说明。
思路及解法
一个正数的七进制表示 num7:a0a1...an−1(其中 n 为其七进制表示的位数,a0 为最高位,an−1 为最低位),其对应的十进制表示为 num10=i=0∑n−1ai×7n−1−i。据此,当我们要计算一个十进制数对应的七进制表示时,可以先计算最低位 an−1=num10mod7,因为 num10 中对 7 有余的部分仅由 an−1 贡献。从两边都减去最低位 an−1 可得,num10−an−1=i=0∑n−2ai×7n−1−i。两边都除以 7,可得 7num10−an−1=i=0∑n−2ai×7n−2−i。此时,7num10−an−1 中对 7 有余的部分仅由 an−2 贡献,可得,an−2=7num10−an−1mod7。依此不停迭代,我们可以从最低位到最高位还原出 num7 的各位数字,直到 num10 归 0。
在代码实现上,输入 num 代表我们思路中的十进制表示 num10,我们需要将还原出的 num7 以字符串的形式返回。
当输入为负时,我们可以先取 num 的绝对值来求七进制,最后再添加负号。
代码
class Solution {
func convertToBase7(_ num: Int) -> String {
if num == 0 {
return "0"
}
let negative: Bool = num < 0
var num: Int = abs(num)
var digits: String = ""
while num > 0 {
digits = String(num % 7) + digits
num = num / 7
}
if negative {
digits = "-" + digits
}
return digits
}
}
复杂度分析
-
时间复杂度:O(log∣num∣),其中 ∣num∣ 表示 num 的绝对值。循环中最多做 O(log∣num∣) 次除法。
-
空间复杂度:O(log∣num∣)。字符数组的长度最多为 O(log∣num∣)。部分语言可以直接修改字符串,空间复杂度为 O(1)。