Simple String Reversal in Java


The challenge

In this challenge, we are going to reverse a string while maintaining the spaces (if any) in their original place.

For example:

solve("our code") = "edo cruo"
-- Normal reversal without spaces is "edocruo". 
-- However, there is a space at index 3, so the string becomes "edo cruo"

solve("your code rocks") = "skco redo cruoy". 
solve("andrew") = "werdna"

More examples in the test cases. All input will be lower case letters and in some cases spaces.

The solution in Java code

Option 1:

class Solution {
    public static String solve(String s) {  
      //string to return
      String reversed = "";
      //removes all whitespace
      String noSpace = s.replaceAll(" ", "");
      //remembers index of which character to use
      int noSpaceCount = noSpace.length()-1;
      
      //for each character in s
      for(int i = 0;i<s.length();i++) {
        
        if(s.charAt(i)==' ') { //if it's a space, add a space
          reversed +=" ";
        } else {
          //if not, then add one of characters from the end of the string
          reversed += String.valueOf(noSpace.charAt(noSpaceCount));
          //decrements to next character to add
          noSpaceCount --;
        }
        
      }
      
      return reversed;
      
    }
}

Option 2:

import java.util.stream.IntStream;
class Solution {
    public static String solve(String s) {
        StringBuilder str = new StringBuilder(s.replaceAll(" ", "")).reverse();
        IntStream.range(0, s.length())
                .filter(i -> s.charAt(i) == ' ')
                .forEach(j -> str.insert(j, ' '));
        return str.toString();
    }
}

Option 3:

import java.util.ArrayList;

class Solution{
    public static String solve(String s) {  
        StringBuilder sb = new StringBuilder(s).reverse();
        for(int i = 0; i < s.length(); i++) {
            if(sb.charAt(i) == ' ') sb.deleteCharAt(i);
            if(s.charAt(i) == ' ') sb.insert(i, " ");
        }
      
      return sb.toString();
     }
}

Test cases to validate our solution

import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;
import java.util.Random;

public class SolutionTest{
    private static Random random = new Random();    
    
    public static String abc2(String s) {  
        String st = "";    
        String noSpace = s.replaceAll("\\s+","");
        int j = noSpace.length()-1;    
        
        for (int i = 0; i < s.length(); ++i) {
             if (s.charAt(i) == ' ') st += " ";
             else {
                 st += noSpace.charAt(j);
                 j--;
             }
        }      
        return st;
      }
  
  private static String rand1() {
      String s = "abcdefghijklmnopqrstuvwxyzab";  
      String st = "";
      boolean flag = false;
      int c = 0;
      int len = random(10,200);
      for (int i = 0; i < len; ++i) {
        if (i > 0 && i < len-2 && flag == true) {
          int t = random(0,10);
          if (t < 3) st += " ";
          flag = false;
        } else {
          int x = random(0,26);
          st += s.charAt(x);
          c++;
          if (c > 1) {
            flag = true;
            c = 0;
        }
          
      }
      
    }
      return st;
  }
    
    private static int random(int l, int u) {
        return random.nextInt(u-l)+l;
    }
    
    @Test
    public void basicTests() {     
        assertEquals("srawedoc",Solution.solve("codewars"));
        assertEquals("edoc ruoy",Solution.solve("your code"));
        assertEquals("skco redo cruoy",Solution.solve("your code rocks"));
    }
    
    @Test
    public void randomTests() { 
        for(int i=0;i<100;i++) {
            String st = rand1();
            System.out.println(st);
            assertEquals(abc2(st),Solution.solve(st));
        }
    }
}