Swift - LeetCode - 七进制数

163 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

题目

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

示例 1:

  • 输入: num = 100
  • 输出: "202"

示例 2:

  • 输入: num = -7
  • 输出: "-10"

方法一:倒推 + 迭代

前言

这道题要求返回给定的整数 num\textit{num} 的七进制表示。部分编程语言有自带的方法或函数可以实现该功能,例如 Java 的 Integer.toString\texttt{Integer.toString}

面试的时候,面试官不会允许直接调用编程语言自带的方法或函数实现进制转换,而是期望看到面试者自行实现进制转换的过程。

以下是使用 Integer.toString\texttt{Integer.toString} 实现进制转换的代码,由于不适合在面试中使用,因此不具体说明。

思路及解法

一个正数的七进制表示 num7:a0a1...an1\textit{num}_7: \overline{a_0a_1...a_{n-1}}(其中 nn 为其七进制表示的位数,a0a_0 为最高位,an1a_{n-1} 为最低位),其对应的十进制表示为 num10=i=0n1ai×7n1i\textit{num}_{10} = \sum\limits_{i=0}^{n-1}a_i \times 7^{n-1-i}。据此,当我们要计算一个十进制数对应的七进制表示时,可以先计算最低位 an1=num10mod7a_{n-1} = \textit{num}_{10} \bmod 7,因为 num10\textit{num}_{10} 中对 7 有余的部分仅由 an1\textit{a}_{n-1} 贡献。从两边都减去最低位 an1\textit{a}_{n-1} 可得,num10an1=i=0n2ai×7n1i\textit{num}_{10} - a_{n-1} = \sum\limits_{i=0}^{n-2}a_i \times 7^{n-1-i}。两边都除以 7,可得 num10an17=i=0n2ai×7n2i\dfrac{\textit{num}_{10} - a_{n-1}}{7} = \sum\limits_{i=0}^{n-2}a_i \times 7^{n-2-i}。此时,num10an17\dfrac{\textit{num}_{10} - a_{n-1}}{7} 中对 7 有余的部分仅由 an2a_{n-2} 贡献,可得,an2=num10an17mod7a_{n-2} = \dfrac{\textit{num}_{10} - a_{n-1}}{7} \bmod 7。依此不停迭代,我们可以从最低位到最高位还原出 num7\textit{num}_7 的各位数字,直到 num10\textit{num}_{10} 归 0。

在代码实现上,输入 num\textit{num} 代表我们思路中的十进制表示 num10\textit{num}_{10},我们需要将还原出的 num7\textit{num}_7 以字符串的形式返回。

当输入为负时,我们可以先取 num\textit{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(lognum)O(\log |\textit{num}|),其中 num|\textit{num}| 表示 num\textit{num} 的绝对值。循环中最多做 O(lognum)O(\log |\textit{num}|) 次除法。

  • 空间复杂度:O(lognum)O(log∣num∣)。字符数组的长度最多为 O(lognum)O(\log |\textit{num}|)。部分语言可以直接修改字符串,空间复杂度为 O(1)O(1)