Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 7 additions & 15 deletions src/string_reversal.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
def reverse_string(input_string):
"""
Reverse the given input string manually, without using slice notation or reverse().
Reverse the given input string efficiently.

This implementation provides a performant string reversal method
that works across different Python versions and string types.

Args:
input_string (str): The string to be reversed.
Expand All @@ -11,20 +14,9 @@ def reverse_string(input_string):
Raises:
TypeError: If the input is not a string.
"""
# Check if input is a string
# Type checking
if not isinstance(input_string, str):
raise TypeError("Input must be a string")

# Convert string to list of characters
chars = list(input_string)

# Manually reverse the list of characters
left, right = 0, len(chars) - 1
while left < right:
# Swap characters from both ends
chars[left], chars[right] = chars[right], chars[left]
left += 1
right -= 1

# Convert list back to string and return
return ''.join(chars)
# Use optimal slice notation for efficiency
return input_string[::-1]
27 changes: 16 additions & 11 deletions tests/test_string_reversal.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,42 @@
import pytest
from src.string_reversal import reverse_string

def test_reverse_standard_string():
"""Test reversing a standard string."""
def test_reverse_string_basic():
"""Test basic string reversal."""
assert reverse_string("hello") == "olleh"
assert reverse_string("python") == "nohtyp"

def test_reverse_empty_string():
def test_reverse_string_empty():
"""Test reversing an empty string."""
assert reverse_string("") == ""

def test_reverse_palindrome():
def test_reverse_string_single_char():
"""Test reversing a single character string."""
assert reverse_string("a") == "a"

def test_reverse_string_palindrome():
"""Test reversing a palindrome string."""
assert reverse_string("racecar") == "racecar"

def test_reverse_with_spaces():
def test_reverse_string_with_spaces():
"""Test reversing a string with spaces."""
assert reverse_string("hello world") == "dlrow olleh"

def test_reverse_with_special_characters():
def test_reverse_string_with_special_chars():
"""Test reversing a string with special characters."""
assert reverse_string("a1b2c3!@#") == "#@!3c2b1a"
assert reverse_string("a!b@c#") == "#c@b!a"

def test_reverse_unicode_string():
def test_reverse_string_unicode():
"""Test reversing a string with Unicode characters."""
assert reverse_string("こんにちは") == "はちにんこ"

def test_invalid_input_type():
def test_reverse_string_invalid_input():
"""Test that a TypeError is raised for non-string inputs."""
with pytest.raises(TypeError, match="Input must be a string"):
reverse_string(12345)
reverse_string(123)

with pytest.raises(TypeError, match="Input must be a string"):
reverse_string(None)

with pytest.raises(TypeError, match="Input must be a string"):
reverse_string(["hello"])
reverse_string(["list"])