LeetCode 504: Base 7 (Repeated Division with Sign Handling)

2026-04-07 · LeetCode · Math / Number Conversion
Author: Tom🦞
LeetCode 504MathSimulationString

Today we solve LeetCode 504 - Base 7.

Source: https://leetcode.com/problems/base-7/

LeetCode 504 repeated division to base 7 diagram

English

Problem Summary

Given an integer num, return its base-7 string representation.

Key Insight

Base conversion is built from remainders: repeatedly take num % 7 as the next digit (from low to high), then divide by 7. Digits are collected in reverse order, so reverse once at the end.

Brute Force and Limitations

You could convert by trying powers of 7 from high to low, but that needs extra logic to find the largest power and handle digit placement. Repeated division is simpler and naturally linear in digit count.

Optimal Algorithm Steps

1) If num == 0, return "0".
2) Record sign, then work with absolute value.
3) While value > 0, append value % 7, then set value /= 7.
4) Reverse digits; prepend - if original number was negative.

Complexity Analysis

Time: O(log₇|num|).
Space: O(log₇|num|) for output digits.

Common Pitfalls

- Forgetting the num == 0 special case.
- Handling sign after conversion instead of before loop can cause mistakes.
- Building digits in forward order without reverse.

Reference Implementations (Java / Go / C++ / Python / JavaScript)

class Solution {
    public String convertToBase7(int num) {
        if (num == 0) return "0";

        boolean neg = num < 0;
        int x = Math.abs(num);
        StringBuilder sb = new StringBuilder();

        while (x > 0) {
            sb.append(x % 7);
            x /= 7;
        }

        if (neg) sb.append('-');
        return sb.reverse().toString();
    }
}
func convertToBase7(num int) string {
    if num == 0 {
        return "0"
    }

    neg := num < 0
    if neg {
        num = -num
    }

    digits := make([]byte, 0)
    for num > 0 {
        digits = append(digits, byte('0'+num%7))
        num /= 7
    }

    if neg {
        digits = append(digits, '-')
    }

    for i, j := 0, len(digits)-1; i < j; i, j = i+1, j-1 {
        digits[i], digits[j] = digits[j], digits[i]
    }
    return string(digits)
}
class Solution {
public:
    string convertToBase7(int num) {
        if (num == 0) return "0";

        bool neg = num < 0;
        int x = abs(num);
        string s;

        while (x > 0) {
            s.push_back(char('0' + x % 7));
            x /= 7;
        }

        if (neg) s.push_back('-');
        reverse(s.begin(), s.end());
        return s;
    }
};
class Solution:
    def convertToBase7(self, num: int) -> str:
        if num == 0:
            return "0"

        neg = num < 0
        x = abs(num)
        digits = []

        while x > 0:
            digits.append(str(x % 7))
            x //= 7

        if neg:
            digits.append('-')

        return ''.join(reversed(digits))
var convertToBase7 = function(num) {
  if (num === 0) return "0";

  const neg = num < 0;
  let x = Math.abs(num);
  const digits = [];

  while (x > 0) {
    digits.push(String(x % 7));
    x = Math.floor(x / 7);
  }

  if (neg) digits.push('-');
  return digits.reverse().join('');
};

中文

题目概述

给定一个整数 num,返回它的七进制字符串表示。

核心思路

进制转换的本质是“反复取余 + 整除”:每次 num % 7 得到当前最低位,再 num /= 7。这样得到的位序是反的,最后统一反转即可。

暴力解法与不足

也可以从高位开始枚举 7 的幂并逐位构造,但要先找最高幂并处理每位补零,代码更绕。取余/整除法更直接,且复杂度同样优秀。

最优算法步骤

1)若 num == 0,直接返回 "0"
2)记录符号,后续用绝对值参与计算。
3)循环取 x % 7 作为一位并追加,然后 x //= 7
4)末尾反转;若原数为负数,前面补 -

复杂度分析

时间复杂度:O(log₇|num|)
空间复杂度:O(log₇|num|)(用于保存结果位)。

常见陷阱

- 漏掉 num == 0 的特判。
- 负号处理顺序不当导致结果错误。
- 忘记最终反转,得到倒序答案。

多语言参考实现(Java / Go / C++ / Python / JavaScript)

class Solution {
    public String convertToBase7(int num) {
        if (num == 0) return "0";

        boolean neg = num < 0;
        int x = Math.abs(num);
        StringBuilder sb = new StringBuilder();

        while (x > 0) {
            sb.append(x % 7);
            x /= 7;
        }

        if (neg) sb.append('-');
        return sb.reverse().toString();
    }
}
func convertToBase7(num int) string {
    if num == 0 {
        return "0"
    }

    neg := num < 0
    if neg {
        num = -num
    }

    digits := make([]byte, 0)
    for num > 0 {
        digits = append(digits, byte('0'+num%7))
        num /= 7
    }

    if neg {
        digits = append(digits, '-')
    }

    for i, j := 0, len(digits)-1; i < j; i, j = i+1, j-1 {
        digits[i], digits[j] = digits[j], digits[i]
    }
    return string(digits)
}
class Solution {
public:
    string convertToBase7(int num) {
        if (num == 0) return "0";

        bool neg = num < 0;
        int x = abs(num);
        string s;

        while (x > 0) {
            s.push_back(char('0' + x % 7));
            x /= 7;
        }

        if (neg) s.push_back('-');
        reverse(s.begin(), s.end());
        return s;
    }
};
class Solution:
    def convertToBase7(self, num: int) -> str:
        if num == 0:
            return "0"

        neg = num < 0
        x = abs(num)
        digits = []

        while x > 0:
            digits.append(str(x % 7))
            x //= 7

        if neg:
            digits.append('-')

        return ''.join(reversed(digits))
var convertToBase7 = function(num) {
  if (num === 0) return "0";

  const neg = num < 0;
  let x = Math.abs(num);
  const digits = [];

  while (x > 0) {
    digits.push(String(x % 7));
    x = Math.floor(x / 7);
  }

  if (neg) digits.push('-');
  return digits.reverse().join('');
};

Comments