Navigating the Loop: Advanced Tips
This approach beautifully sidesteps non-alphabetical characters. But let's talk about the "how" for a moment. To ensure accuracy, remember to iterate the reversedAlpha
array independently from the loop that scans the original string.
Optional: Simplifying with .shift()
If the thought of juggling another pointer or index leaves you dizzy, here's a simpler alternative: use the .shift()
method. This function efficiently grabs the left-most element in an array, essentially doing the pointer's job for you. Imagine it as having a helper who hands you each reversed "gold coin" as you walk along your original path.
Method 2: The Two-Pointer Skip Technique

Dual Pointers with a Twist
The second approach also involves using two pointers, much like our first method. However, this one comes with a twist: it skips over the non-alphabetical characters directly.
How to Skip Efficiently
Just like in a dance, when a couple realizes they are out of sync, they adjust their steps. Similarly, if either of the pointers encounters a non-alphabetical character, it simply "dances" past it, without making a swap.
By adopting this approach, you get to keep the original sequence of non-alphabetical characters intact while reversing only the alphabets. Think of it as flipping some tiles on a mosaic floor without disturbing the overall pattern.
1function isAlpha(c) {
2 return (c >= 65 && c <= 90) || (c >= 97 && c <= 122);
3}
4
5function swap(arr, a, b) {
6 let t = arr[a];
7 arr[a] = arr[b];
8 arr[b] = t;
9}
10
11function reverseOnlyAlphabetical(str) {
12 const result = str.split("");
13 let left = 0;
14 let right = result.length - 1;
15
16 while (left < right) {
17 if (!isAlpha(result[left].charCodeAt())) {
18 left++;
19 } else if (!isAlpha(result[right].charCodeAt())) {
20 right--;
21 } else {
22 swap(result, left++, right--);
23 }
24 }
25
26 return result.join("");
27}
28
29console.log(reverseOnlyAlphabetical("sea!$hells3"));