Skip to content

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:

Input
12345
Output
3
Input
-987
Output
-8
Input
-1357
Output
-2
Input
-3333
Output
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:
    sign   = -1 if n < 0 else 1
    digits = str(abs(n))
    length = len(digits)
    mid    = length // 2
    if length % 2 == 1:
        result = int(digits[mid])
    else:
        result = abs(int(digits[mid - 1]) - int(digits[mid]))
    return sign * result
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
def signed_abs_diff_of_middle_digits(n: int) -> int:
    sign   = -1 if n < 0 else 1
    d      = str(abs(n))
    m      = len(d) // 2
    result = (int(d[m]) if len(d) % 2 == 1
              else abs(int(d[m-1]) - int(d[m])))
    return sign * result

Ternary expression picks between the two cases. Compact without sacrificing readability.


Key takeaways

01

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.

02

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.

03

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.