2553. Separate the Digits in an Array
Problem Description
You are given an array of positive integers nums
. Your task is to create a new array answer
that contains all the individual digits from each number in nums
, preserving their original order.
When you separate a number into its digits, you extract each digit while maintaining their left-to-right sequence. For instance, if you have the number 10921
, separating it gives you the array [1, 0, 9, 2, 1]
.
The process works as follows:
- Take each number from the input array
nums
- Break it down into its individual digits
- Add these digits to the result array in the same order they appear
- Continue this for all numbers in
nums
For example, if nums = [13, 25, 83]
, the output would be [1, 3, 2, 5, 8, 3]
because:
13
becomes[1, 3]
25
becomes[2, 5]
83
becomes[8, 3]
- Combining them in order gives
[1, 3, 2, 5, 8, 3]
The solution extracts digits from each number by repeatedly taking the remainder when dividing by 10 (which gives the rightmost digit) and then dividing by 10 to remove that digit. Since this process extracts digits from right to left, the digits are collected in a temporary list and then reversed before adding to the final answer.
Intuition
The key insight is that we need to extract individual digits from each number while preserving their order. The most straightforward way to extract digits from a number is through mathematical operations.
When we think about how to get individual digits from a number like 123
, we can use the modulo operation. The expression 123 % 10
gives us 3
(the last digit), and 123 // 10
gives us 12
(removing the last digit). We can repeat this process: 12 % 10
gives 2
, and 12 // 10
gives 1
. Finally, 1 % 10
gives 1
, and 1 // 10
gives 0
, which tells us we're done.
However, this approach extracts digits from right to left (we get 3
, then 2
, then 1
), but we need them in left-to-right order (1
, 2
, 3
). This is why we collect the digits in a temporary list and reverse it before adding to our final answer.
The pattern becomes clear:
- For each number, repeatedly use
% 10
to get the rightmost digit - Use
// 10
to remove that digit from the number - Continue until the number becomes 0
- Since we collected digits in reverse order, flip them back to get the correct sequence
- Add these digits to our result array
This mathematical approach is efficient and doesn't require converting numbers to strings, making it a clean solution for digit extraction.
Solution Approach
The solution implements a simulation approach where we process each number in the array and extract its digits one by one.
Here's how the algorithm works step by step:
-
Initialize the result array: We create an empty list
ans
that will store all the separated digits. -
Iterate through each number: We loop through each integer
x
in the input arraynums
. -
Extract digits from each number: For each number
x
, we:- Create a temporary list
t
to store the digits of the current number - Use a while loop that continues as long as
x
is not zero - In each iteration:
- Extract the rightmost digit using
x % 10
and append it tot
- Remove the rightmost digit by integer division:
x //= 10
- Extract the rightmost digit using
- Create a temporary list
-
Handle the digit order: Since the modulo operation extracts digits from right to left, but we need them from left to right, we reverse the temporary list using
t[::-1]
. -
Add to result: We extend the answer array with the reversed digits using
ans.extend(t[::-1])
.
Let's trace through an example with nums = [123, 45]
:
- For
123
:123 % 10 = 3
,t = [3]
,x = 12
12 % 10 = 2
,t = [3, 2]
,x = 1
1 % 10 = 1
,t = [3, 2, 1]
,x = 0
- Reverse
t
to get[1, 2, 3]
and add toans
- For
45
:45 % 10 = 5
,t = [5]
,x = 4
4 % 10 = 4
,t = [5, 4]
,x = 0
- Reverse
t
to get[4, 5]
and add toans
- Final result:
[1, 2, 3, 4, 5]
The time complexity is O(n * d)
where n
is the number of elements in nums
and d
is the average number of digits per number. The space complexity is O(d)
for the temporary list used to store digits of each number.
Ready to land your dream job?
Unlock your dream job with a 3-minute evaluator for a personalized learning plan!
Start EvaluatorExample Walkthrough
Let's walk through a small example with nums = [52, 7, 406]
to illustrate the solution approach.
Step 1: Process the first number (52)
- Initialize temporary list
t = []
- Extract digits from right to left:
52 % 10 = 2
, add tot
:t = [2]
, updatex = 52 // 10 = 5
5 % 10 = 5
, add tot
:t = [2, 5]
, updatex = 5 // 10 = 0
- Loop ends since
x = 0
- Reverse
t
to get correct order:[2, 5]
→[5, 2]
- Add to result:
ans = [5, 2]
Step 2: Process the second number (7)
- Initialize temporary list
t = []
- Extract digits:
7 % 10 = 7
, add tot
:t = [7]
, updatex = 7 // 10 = 0
- Loop ends since
x = 0
- Reverse
t
:[7]
→[7]
(single digit stays the same) - Add to result:
ans = [5, 2, 7]
Step 3: Process the third number (406)
- Initialize temporary list
t = []
- Extract digits from right to left:
406 % 10 = 6
, add tot
:t = [6]
, updatex = 406 // 10 = 40
40 % 10 = 0
, add tot
:t = [6, 0]
, updatex = 40 // 10 = 4
4 % 10 = 4
, add tot
:t = [6, 0, 4]
, updatex = 4 // 10 = 0
- Loop ends since
x = 0
- Reverse
t
to get correct order:[6, 0, 4]
→[4, 0, 6]
- Add to result:
ans = [5, 2, 7, 4, 0, 6]
Final Result: [5, 2, 7, 4, 0, 6]
The key insight is that we extract digits mathematically using modulo and integer division operations, which naturally gives us digits from right to left. By reversing each number's digits before adding them to our answer, we maintain the correct left-to-right order as required.
Solution Implementation
1class Solution:
2 def separateDigits(self, nums: List[int]) -> List[int]:
3 """
4 Separates each integer in the input list into its individual digits.
5
6 Args:
7 nums: List of non-negative integers
8
9 Returns:
10 List containing all digits from the input numbers in order
11 """
12 result = []
13
14 for number in nums:
15 # Extract digits from current number
16 digits_stack = []
17
18 # Extract digits using modulo (gives digits in reverse order)
19 while number > 0:
20 digit = number % 10 # Get the last digit
21 digits_stack.append(digit)
22 number //= 10 # Remove the last digit
23
24 # Add digits in correct order (reverse the stack)
25 result.extend(digits_stack[::-1])
26
27 return result
28
1class Solution {
2 /**
3 * Separates each number in the input array into its individual digits
4 * and returns all digits in a single array maintaining the original order.
5 *
6 * @param nums The input array of integers to separate
7 * @return An array containing all individual digits from the input numbers
8 */
9 public int[] separateDigits(int[] nums) {
10 // List to store all separated digits
11 List<Integer> resultList = new ArrayList<>();
12
13 // Process each number in the input array
14 for (int number : nums) {
15 // Temporary list to store digits of current number
16 List<Integer> digitsOfCurrentNumber = new ArrayList<>();
17
18 // Extract digits from right to left using modulo and division
19 while (number > 0) {
20 digitsOfCurrentNumber.add(number % 10); // Get the rightmost digit
21 number /= 10; // Remove the rightmost digit
22 }
23
24 // Reverse to get digits in correct order (left to right)
25 Collections.reverse(digitsOfCurrentNumber);
26
27 // Add all digits of current number to the result list
28 resultList.addAll(digitsOfCurrentNumber);
29 }
30
31 // Convert List<Integer> to int array
32 int[] resultArray = new int[resultList.size()];
33 for (int i = 0; i < resultArray.length; i++) {
34 resultArray[i] = resultList.get(i);
35 }
36
37 return resultArray;
38 }
39}
40
1class Solution {
2public:
3 vector<int> separateDigits(vector<int>& nums) {
4 vector<int> result;
5
6 // Process each number in the input array
7 for (int number : nums) {
8 vector<int> tempDigits;
9
10 // Extract digits from right to left by repeatedly dividing by 10
11 // This gives us digits in reverse order
12 while (number > 0) {
13 tempDigits.push_back(number % 10); // Get the rightmost digit
14 number /= 10; // Remove the rightmost digit
15 }
16
17 // Add digits to result in correct order (left to right)
18 // Since tempDigits has digits in reverse, we pop from the back
19 while (!tempDigits.empty()) {
20 result.push_back(tempDigits.back());
21 tempDigits.pop_back();
22 }
23 }
24
25 return result;
26 }
27};
28
1/**
2 * Separates each number in the array into its individual digits
3 * @param nums - Array of positive integers to separate
4 * @returns Array containing all digits from all numbers in order
5 */
6function separateDigits(nums: number[]): number[] {
7 const result: number[] = [];
8
9 // Process each number in the input array
10 for (const currentNumber of nums) {
11 const digits: number[] = [];
12 let remainingNumber = currentNumber;
13
14 // Extract digits from right to left using modulo operation
15 while (remainingNumber > 0) {
16 // Get the rightmost digit
17 digits.push(remainingNumber % 10);
18 // Remove the rightmost digit
19 remainingNumber = Math.floor(remainingNumber / 10);
20 }
21
22 // Reverse to get digits in correct order (left to right) and add to result
23 result.push(...digits.reverse());
24 }
25
26 return result;
27}
28
Time and Space Complexity
The time complexity is O(n × log₁₀ M)
, where n
is the length of the array nums
and M
is the maximum value in the array nums
. This is because:
- The outer loop iterates through all
n
elements in the array - For each number
x
, the inner while loop executeslog₁₀(x)
times (the number of digits inx
) - In the worst case, when
x = M
, this becomeslog₁₀ M
iterations - Therefore, the total time complexity is
O(n × log₁₀ M)
The space complexity is O(n × log₁₀ M)
, where n
is the length of the array nums
and M
is the maximum value in the array nums
. This is because:
- The temporary list
t
stores at mostlog₁₀ M
digits for each number - The final answer list
ans
stores all separated digits from all numbers, which totals toO(n × log₁₀ M)
in the worst case - The space used by
t
is reused for each number, but the overall space requirement is dominated by theans
list
Learn more about how to find time and space complexity quickly.
Common Pitfalls
1. Handling Zero Values
The most critical pitfall in this solution is that it fails to handle the number 0
correctly. When the input contains 0
, the while loop condition while number > 0
immediately evaluates to false, causing the algorithm to skip the zero entirely instead of adding it as a digit.
Example of the bug:
- Input:
nums = [30, 0, 105]
- Expected output:
[3, 0, 0, 1, 0, 5]
- Actual buggy output:
[3, 0, 1, 0, 5]
(the standalone0
is missing)
Solution: Check if the number is zero before entering the loop and handle it as a special case:
for number in nums: digits_stack = [] # Special case: handle zero if number == 0: result.append(0) continue # Extract digits for non-zero numbers while number > 0: digit = number % 10 digits_stack.append(digit) number //= 10 result.extend(digits_stack[::-1])
2. Alternative Approach Pitfall: String Conversion
Many developers might think to use string conversion as a simpler approach:
for number in nums:
result.extend([int(d) for d in str(number)])
While this works and is more concise, it has potential downsides:
- Performance overhead: String conversion and parsing can be slower for large numbers
- Memory overhead: Creates intermediate string objects
- Type conversion costs: Converting from int to string and back to int for each digit
However, for most practical cases, the string approach is actually cleaner and less error-prone than the mathematical approach, especially considering the zero-handling issue.
3. Integer Division Operator Confusion
Using regular division /
instead of integer division //
would cause type errors since regular division returns a float in Python 3:
# Wrong: number = number / 10 # Results in float # Correct: number = number // 10 # Results in integer
This would lead to infinite loops or type errors when trying to use modulo on floats.
What are the most two important steps in writing a depth first search function? (Select 2)
Recommended Readings
Coding Interview Patterns Your Personal Dijkstra's Algorithm to Landing Your Dream Job The goal of AlgoMonster is to help you get a job in the shortest amount of time possible in a data driven way We compiled datasets of tech interview problems and broke them down by patterns This way
Recursion Recursion is one of the most important concepts in computer science Simply speaking recursion is the process of a function calling itself Using a real life analogy imagine a scenario where you invite your friends to lunch https assets algo monster recursion jpg You first call Ben and ask
Runtime Overview When learning about algorithms and data structures you'll frequently encounter the term time complexity This concept is fundamental in computer science and offers insights into how long an algorithm takes to complete given a certain input size What is Time Complexity Time complexity represents the amount of time
Want a Structured Path to Master System Design Too? Don’t Miss This!