Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Smallest Good Base

Updated
2 min read

Introduction

In this blog post, we will explore how to solve the LeetCode problem "483" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.

Problem Statement

Given an integer n represented as a string, return the smallest good base of n. We call k >= 2 a good base of n, if all digits of n base k are 1's. Example 1: Input: n = "13" Output: "3" Explanation: 13 base 3 is 111. Example 2: Input: n = "4681" Output: "8" Explanation: 4681 base 8 is 11111. Example 3: Input: n = "1000000000000000000" Output: "999999999999999999" Explanation: 1000000000000000000 base 999999999999999999 is 11. Constraints: n is an integer in the range [3, 1018]. n does not contain any leading zeros.

Explanation

Here's the solution to find the smallest good base of a given integer n:

  • Binary Search for Base: Iterate through possible lengths of the base-k representation (from maximum possible length down to 2). For each length, use binary search to find a potential base k.

  • Check if Base is Good: For a given base k and length m, check if the representation of n in base k consists only of ones. This can be done by calculating the sum k^0 + k^1 + ... + k^(m-1) and comparing it to n.

  • Return Smallest Good Base: Return the smallest good base found during the iteration. If no good base is found, return n - 1.

  • Complexity:

    • Runtime: O(log(n)^2)
    • Storage: O(1)

Code

    def smallestGoodBase(n: str) -> str:
    n_int = int(n)
    max_m = int((n_int - 1)).bit_length()

    for m in range(max_m, 1, -1):
        low = 2
        high = n_int - 1
        while low <= high:
            k = (low + high) // 2
            sum_val = 0
            power = 1
            for _ in range(m):
                if sum_val > n_int // k:  # Optimization to avoid overflow
                    sum_val = n_int + 1  # Ensure sum_val > n_int to trigger high adjustment
                    break
                sum_val += power
                if power > n_int // k:
                   sum_val = n_int+1
                   break
                power *= k

            if sum_val == n_int:
                return str(k)
            elif sum_val < n_int:
                low = k + 1
            else:
                high = k - 1

    return str(n_int - 1)

More from this blog

C

Chatmagic blog

2894 posts