Article Categories
- All Categories
-
Data Structure
-
Networking
-
RDBMS
-
Operating System
-
Java
-
MS Excel
-
iOS
-
HTML
-
CSS
-
Android
-
Python
-
C Programming
-
C++
-
C#
-
MongoDB
-
MySQL
-
Javascript
-
PHP
-
Economics & Finance
Selected Reading
Program to find sum of concatenated pairs of all each element in a list in Python?
Given a list of numbers, we need to find the sum of all possible concatenated pairs. Each pair (i, j) where i and j are indices is considered different from pair (j, i).
For example, with nums = [5, 3], we get concatenations: 55, 53, 35, 33, which sum to 176.
Algorithm
We use memoization to avoid recalculating concatenations for duplicate numbers ?
def find_concatenated_sum(nums):
memo = {}
total_sum = 0
n = len(nums)
for i in range(n):
if nums[i] == 0:
# Special case: concatenating 0 with any number gives that number
total_sum += sum(nums)
else:
if nums[i] in memo:
total_sum += memo[nums[i]]
else:
# Calculate sum of all concatenations starting with nums[i]
concatenation_sum = 0
for j in range(n):
concatenated_value = int(str(nums[i]) + str(nums[j]))
concatenation_sum += concatenated_value
memo[nums[i]] = concatenation_sum
total_sum += concatenation_sum
return total_sum
# Test the function
nums = [5, 3]
result = find_concatenated_sum(nums)
print(f"Sum of concatenated pairs: {result}")
Sum of concatenated pairs: 176
Step-by-Step Breakdown
Let's trace through the example with nums = [5, 3] ?
def find_concatenated_sum_with_trace(nums):
memo = {}
total_sum = 0
n = len(nums)
print(f"Input: {nums}")
print("Calculating concatenations:")
for i in range(n):
print(f"\nProcessing nums[{i}] = {nums[i]}")
if nums[i] == 0:
addition = sum(nums)
total_sum += addition
print(f" Special case for 0: adding {addition}")
else:
if nums[i] in memo:
addition = memo[nums[i]]
total_sum += addition
print(f" Found in memo: adding {addition}")
else:
concatenation_sum = 0
concatenations = []
for j in range(n):
concatenated_value = int(str(nums[i]) + str(nums[j]))
concatenation_sum += concatenated_value
concatenations.append(f"{nums[i]} + {nums[j]} = {concatenated_value}")
memo[nums[i]] = concatenation_sum
total_sum += concatenation_sum
print(f" Concatenations: {', '.join(concatenations)}")
print(f" Sum for {nums[i]}: {concatenation_sum}")
return total_sum
# Test with trace
nums = [5, 3]
result = find_concatenated_sum_with_trace(nums)
print(f"\nFinal result: {result}")
Input: [5, 3] Calculating concatenations: Processing nums[0] = 5 Concatenations: 5 + 5 = 55, 5 + 3 = 53 Sum for 5: 108 Processing nums[1] = 3 Concatenations: 3 + 5 = 35, 3 + 3 = 33 Sum for 3: 68 Final result: 176
Optimized Class-Based Solution
Here's the solution using a class structure ?
class ConcatenatedSumSolver:
def solve(self, nums):
memo = {}
total_sum = 0
n = len(nums)
for i in range(n):
if nums[i] == 0:
total_sum += sum(nums)
else:
if nums[i] in memo:
total_sum += memo[nums[i]]
else:
concatenation_sum = 0
for j in range(n):
concatenated_value = int(str(nums[i]) + str(nums[j]))
concatenation_sum += concatenated_value
memo[nums[i]] = concatenation_sum
total_sum += concatenation_sum
return total_sum
# Test the solution
solver = ConcatenatedSumSolver()
test_cases = [[5, 3], [1, 2, 3], [0, 5]]
for nums in test_cases:
result = solver.solve(nums)
print(f"Input: {nums}, Output: {result}")
Input: [5, 3], Output: 176 Input: [1, 2, 3], Output: 396 Input: [0, 5], Output: 60
Key Points
- Memoization: Stores results for duplicate numbers to avoid recalculation
-
String Concatenation: Uses
str(a) + str(b)to concatenate digits - Special Case: Handles zero separately since concatenating with 0 follows different rules
- Time Complexity: O(n²) in worst case when all numbers are unique
- Space Complexity: O(k) where k is the number of unique elements
Conclusion
This algorithm efficiently calculates the sum of all concatenated pairs using memoization to optimize repeated calculations. The key insight is treating each number as a string for concatenation, then converting back to integer for summation.
Advertisements
