Challenge 24
String Reversal
Write a function string_reversal
that reverses a mutable string slice (&mut str) in-place without allocating new memory on the heap (no String::from or Vec::from).
fn string_reversal(s: &mut str) { // your implementation goes here // dont touch the code in the main function below } fn main() { // Test case 1: Basic reversal let mut s = String::from("Rust Bytes!"); let ptr_before = s.as_ptr(); { let s_slice: &mut str = &mut s; string_reversal(s_slice); } let ptr_after = s.as_ptr(); if s != "!setyB tsuR" { panic!("Test failed: Expected '!setyB tsuR', got '{}'", s); } if ptr_before != ptr_after { panic!("Test failed: Memory location changed"); } println!("Test 1 passed: s = '{}', memory location unchanged", s); // Test case 2: Empty string let mut empty = String::from(""); let ptr_before = empty.as_ptr(); { let s_slice: &mut str = &mut empty; string_reversal(s_slice); } let ptr_after = empty.as_ptr(); if empty != "" { panic!("Test failed: Expected '', got '{}'", empty); } if ptr_before != ptr_after { panic!("Test failed: Memory location changed"); } println!("Test 2 passed: empty = '{}', memory location unchanged", empty); // Test case 3: Single character let mut single = String::from("a"); let ptr_before = single.as_ptr(); { let s_slice: &mut str = &mut single; string_reversal(s_slice); } let ptr_after = single.as_ptr(); if single != "a" { panic!("Test failed: Expected 'a', got '{}'", single); } if ptr_before != ptr_after { panic!("Test failed: Memory location changed"); } println!("Test 3 passed: single = '{}', memory location unchanged", single); }
Solution
Click to Show/Hide Solution
#![allow(unused)] fn main() { fn string_reversal(s: &mut str) { let bytes = unsafe { s.as_bytes_mut() }; let (mut left, mut right) = (0, bytes.len().saturating_sub(1)); while left < right { bytes.swap(left, right); left += 1; right -= 1; } } }