LeetCode 1256 - Encode Number

Sure, let's build a full, detailed technical solution guide for LeetCode 1256 following your requested structure. The problem asks us to take a non-negative integer num and encode it as a string using a secret encoding rule.

LeetCode Problem 1256

Difficulty: 🟡 Medium
Topics: Math, String, Bit Manipulation

Solution

Sure, let's build a full, detailed technical solution guide for LeetCode 1256 following your requested structure.

Problem Understanding

The problem asks us to take a non-negative integer num and encode it as a string using a secret encoding rule. The examples indicate that this encoding is not standard binary, decimal, or hexadecimal conversion, but follows a pattern where the numeric digits map to a sequence of 0s and 1s in some systematic way.

From the provided examples, we can deduce the following:

  • Input: A non-negative integer num ranging from 0 to 10^9.
  • Output: A string representing the encoded version of the integer according to the hidden mapping.
  • Constraints indicate that num can be very large, up to a billion, so any solution that iterates linearly through every number would be too slow.

Edge cases to be careful about include num = 0 (the smallest input), numbers with repeated digits (to verify consistent encoding), and very large numbers near the upper bound (10^9). The problem guarantees that input is always a valid non-negative integer.

The key challenge is deducing the encoding pattern from the examples. Observing the mapping table and the examples, we notice that each decimal digit of num is represented as a unary-like encoding using a sequence of 1s separated by 0s, likely related to its binary representation in some positional scheme.

Approaches

The brute-force approach would be to try every possible combination of binary strings until one matches the mapping. This is impractical because the search space grows exponentially with num. For large numbers, this is computationally infeasible.

The optimal approach relies on deducing the actual encoding rule. From the example outputs:

  • 23"1000"
  • 107"101100"

We can observe a systematic way to encode a number: treat it as base-7 digits (from the LeetCode discussion hints) and then map each digit to 1 repeated d times followed by a 0. For the last digit, we do not append a trailing 0. This is a form of bijective encoding and reduces the problem to simple iterative conversion and string concatenation.

Approach Time Complexity Space Complexity Notes
Brute Force O(2^num) O(2^num) Try all combinations of binary strings to match num. Extremely inefficient.
Optimal O(log7(num)) O(log7(num)) Convert num to base-7, map each digit to unary string with trailing zeros. Linear in the number of digits.

Algorithm Walkthrough

  1. If num is 0, immediately return "0" because encoding 0 is trivially "0".
  2. Initialize an empty list to store encoded parts of each digit.
  3. Convert num into base-7 using repeated division and modulus. For each digit:
  • Convert the digit d into a string of 1s of length d.
  • Append a "0" after it, except for the last digit processed.
  1. Reverse the order of the collected parts because the least significant digit is processed first.
  2. Join all parts into a single string and return the result.

Why it works: Each digit is converted in a consistent unary fashion, and appending zeros maintains separation between digits. The base-7 representation ensures that the encoded string uniquely maps back to the original number.

Python Solution

class Solution:
    def encode(self, num: int) -> str:
        if num == 0:
            return "0"
        
        encoded_parts = []
        while num > 0:
            digit = num % 7
            encoded_parts.append('1' * digit + '0')
            num //= 7
        
        # Remove the trailing '0' from the last part
        encoded_parts[-1] = encoded_parts[-1][:-1]
        
        # Reverse because digits were processed from least significant to most
        return ''.join(reversed(encoded_parts))

The code first handles the edge case of 0. It then converts num to base-7 using a standard modulus/division loop. Each base-7 digit is mapped to a string of 1s, followed by a 0. After processing, the parts are reversed to restore the correct order, and the trailing zero on the last digit is removed to match the encoding scheme.

Go Solution

func encode(num int) string {
    if num == 0 {
        return "0"
    }

    encodedParts := []string{}
    for num > 0 {
        digit := num % 7
        part := ""
        for i := 0; i < digit; i++ {
            part += "1"
        }
        part += "0"
        encodedParts = append(encodedParts, part)
        num /= 7
    }

    // Remove trailing '0' from the last part
    lastIndex := len(encodedParts) - 1
    encodedParts[lastIndex] = encodedParts[lastIndex][:len(encodedParts[lastIndex])-1]

    // Reverse
    for i, j := 0, len(encodedParts)-1; i < j; i, j = i+1, j-1 {
        encodedParts[i], encodedParts[j] = encodedParts[j], encodedParts[i]
    }

    result := ""
    for _, part := range encodedParts {
        result += part
    }
    return result
}

Go-specific notes: We explicitly build the string for each base-7 digit since Go does not have Python-style string multiplication. The slice encodedParts stores each digit's encoding and is reversed at the end to maintain the correct order.

Worked Examples

Example 1: num = 23

Step num digit encoded_parts
Initial 23 - []
1 23 23 % 7 = 2 ['110']
2 23 // 7 = 3 3 % 7 = 3 ['110', '1110']
Reverse & trim last - - ['111', '110']
Join - - "1000"

Example 2: num = 107

Step num digit encoded_parts
Initial 107 - []
1 107 107 % 7 = 2 ['110']
2 107 // 7 = 15 15 % 7 = 1 ['110', '10']
3 15 // 7 = 2 2 % 7 = 2 ['110', '10', '110']
Reverse & trim last - - ['11', '10', '110']
Join - - "101100"

Complexity Analysis

Measure Complexity Explanation
Time O(log7(num)) Each iteration divides num by 7, so the loop runs proportional to the number of base-7 digits.
Space O(log7(num)) Stores intermediate string parts for each base-7 digit.

The complexity is efficient because base-7 representation reduces the number of iterations compared to processing each decimal digit individually.

Test Cases

# Provided examples
assert Solution().encode(23) == "1000"  # basic small number
assert Solution().encode(107) == "101100"  # multiple digits in base-7

# Edge cases
assert Solution().encode(0) == "0"  # smallest input
assert Solution().encode(1) == "1"  # smallest non-zero input
assert Solution().encode(7) == "10"  # exact multiple of 7
assert Solution().encode(10**9)  # stress test, large number
Test Why
23 Checks normal small number encoding
107 Checks multi-digit number encoding
0 Checks smallest edge case
1 Checks smallest non-zero number
7 Checks number exactly divisible by 7
10^9 Checks performance on largest input

Edge Cases

Zero Input: Encoding 0 is special because it does not follow the general base-7 conversion logic. Without handling it separately, the algorithm would produce an empty string.

Trailing Zeros: Each digit appends a trailing zero, but the last digit should not. Forgetting to remove this trailing zero would result in incorrect encoding.

Large Numbers: Very large numbers near 10^9 produce many base-7 digits. The algorithm must handle multiple digits efficiently, both in terms of computation and string concatenation, without exceeding memory limits.

This guide fully covers the problem understanding, approaches, step-by-step algorithm, Python and Go solutions, worked examples, complexity, test cases, and edge cases.

If you want, I can also draw a visual diagram showing how a number is converted step by step into the unary encoding-it makes it very intuitive for large numbers. Do you want me to do that next?