Last week it was a simple problem that we discussed to tangle our brain.
Reverse only alphabets in a provided string in a most efficient way. (Special characters, numbers, etc should continue to stay at their original place)
First thought …
Okay, so first thought was to make use of an extra space and then we can get our desired result with two traversals of the string. Yeah, but let’s optimize.
Updated thought …
We can make the swaps in place in a single traversal. A good stopping criteria seems to be when index while moving from front crosses the index moving backwards from end.
Let’s write code:
static void Main(string[] args)
{
Console.WriteLine($"Please enter a string:");
// Ignore casing
var inputString = Console.ReadLine().ToLower();
char[] inputArray = inputString.ToCharArray();
ReverseAlphabetsOnly(inputArray);
Console.WriteLine(
$"Reversed: {new String(inputArray)}");
}
static void ReverseAlphabetsOnly(char[] inputArray)
{
int frontIndex = 0;
int endIndex = inputArray.Length-1;
char temp;
while(frontIndex < endIndex)
{
if(!IsAlphabet(inputArray[frontIndex]))
frontIndex++;
else if(!IsAlphabet(inputArray[endIndex]))
endIndex--;
else
{
temp = inputArray[frontIndex];
inputArray[frontIndex]
= inputArray[endIndex];
inputArray[endIndex] = temp;
frontIndex++;
endIndex--;
}
}
}
static bool IsAlphabet(char x)
{
return ( (x >= 'a' && x <= 'z')
|| (x >= 'A' && x <= 'Z') );
}
// Input: Le@rn By In$ig#t...
// Output: tg@in Iy Bn$re#L...
Closure …
Approach looks good, as it would be at maximum a single traversal with no extra space used. Thus we are able to solve it with an overall Order of Time complexity O(n)
& Space complexity O(1)
.
Happy solving …