S1Q2 · Signed Absolute Difference of Middle Digits¶
⚡ Quick Reference
Function: signed_abs_diff_of_middle_digits(n: int) -> int
Core idea: work on the digit string of abs(n), find the middle, compute the result, then restore the sign.
def signed_abs_diff_of_middle_digits(n: int) -> int:
sign = -1 if n < 0 else 1
digits = str(abs(n))
length = len(digits)
mid = length // 2
if length % 2 == 1: # odd digits → single middle
result = int(digits[mid])
else: # even digits → abs diff of two middles
result = abs(int(digits[mid - 1]) - int(digits[mid]))
return sign * result
Key rules:
- Strip sign first: work on abs(n) digits
- Odd length → middle digit at index len // 2
- Even length → abs(digits[mid-1] - digits[mid]) where mid = len // 2
- Reapply sign at the end: sign * result
Problem Statement¶
Problem
Write a function signed_abs_diff_of_middle_digits(n) that returns the middle digit (odd length) or absolute difference of the two middle digits (even length), with the sign of n.
Examples:
12345
3
-987
-8
-1357
-2
-3333
0
Understanding the problem¶
Step 1: Extract digits from abs(n) as a string.
Step 2: Find the middle based on length:
"12345" → length=5 (odd), mid=2 → digits[2] = '3' → result = 3
"987" → length=3 (odd), mid=1 → digits[1] = '8' → result = 8
"9897" → length=4 (even), mid=2 → |digits[1]-digits[2]|
= |'8'-'9'| ... wait
For -9897: digits = "9897", mid = 2
- digits[mid-1] = digits[1] = '8'
- digits[mid] = digits[2] = '9'
- abs(8 - 9) = 1, sign = -1 → -1 ✓
For -1357: digits = "1357", mid = 2
- digits[1] = '3', digits[2] = '5'
- abs(3 - 5) = 2, sign = -1 → -2 ✓
Step 3: Apply sign of n.
Tracing all examples¶
n |
abs(n) digits |
length | odd/even | middle indices | result | sign | output |
|---|---|---|---|---|---|---|---|
12345 |
"12345" |
5 | odd | [2]=3 |
3 | +1 | 3 ✓ |
-987 |
"987" |
3 | odd | [1]=8 |
8 | -1 | -8 ✓ |
-9897 |
"9897" |
4 | even | [1]=8, [2]=9 |
|8-9|=1 | -1 | -1 ✓ |
-1357 |
"1357" |
4 | even | [1]=3, [2]=5 |
|3-5|=2 | -1 | -2 ✓ |
1357 |
"1357" |
4 | even | [1]=3, [2]=5 |
|3-5|=2 | +1 | 2 ✓ |
-3333 |
"3333" |
4 | even | [1]=3, [2]=3 |
|3-3|=0 | -1 | 0 ✓ |
Solution approaches¶
def signed_abs_diff_of_middle_digits(n: int) -> int:
# Determine sign
sign = -1 if n < 0 else 1
# Work on digits of absolute value
digits = str(abs(n))
length = len(digits)
mid = length // 2
if length % 2 == 1:
# Odd length - single middle digit
middle_digit = int(digits[mid])
result = middle_digit
else:
# Even length - two middle digits
left = int(digits[mid - 1])
right = int(digits[mid])
result = abs(left - right)
return sign * result
Key takeaways¶
Strip sign first, reapply at the end
Work on str(abs(n)) to avoid dealing with the minus sign in the digit string. Store the sign separately as -1 or +1 and multiply at the end.
mid = len // 2 - works for both parities
For odd length, digits[mid] is the exact centre. For even length, the two middle digits are at digits[mid-1] and digits[mid]. One formula covers both with the parity check.
sign * 0 == 0 regardless of sign
When the two middle digits are equal (like -3333), abs(3-3) = 0 and -1 * 0 = 0. The sign doesn't matter for zero - both positive and negative give the same result.