Solving the “Mexican Wave” Challenge using Java

The challenge

Task

Your task is to create a function that turns a string into a Mexican Wave. You will be passed a string and you must return that string in an array where an uppercase letter is a person standing up.

Rules

1.  The input string will always be lowercase but may be empty.
2.  If the character in the string is whitespace then pass over it as if it was an empty seat.

Example

wave("hello") => []string{"Hello", "hEllo", "heLlo", "helLo", "hellO"}
Code language: Java (java)

Test cases

import static org.junit.Assert.assertArrayEquals; import org.junit.Test; import org.junit.runners.JUnit4; import java.util.Arrays; public class SolutionTest { @Test public void basicTest1() { String[] result = new String[] { "Hello", "hEllo", "heLlo", "helLo", "hellO" }; assertArrayEquals("it should return '" + Arrays.toString(result) + "'", result, MexicanWave.wave("hello")); } @Test public void basicTest2() { String[] result = new String[] { "Codewars", "cOdewars", "coDewars", "codEwars", "codeWars", "codewArs", "codewaRs", "codewarS" }; assertArrayEquals("it should return '" + Arrays.toString(result) + "'", result, MexicanWave.wave("codewars")); } @Test public void basicTest3() { String[] result = new String[] { }; assertArrayEquals("it should return '" + Arrays.toString(result) + "'", result, MexicanWave.wave("")); } @Test public void basicTest4() { String[] result = new String[] { "Two words", "tWo words", "twO words", "two Words", "two wOrds", "two woRds", "two worDs", "two wordS" }; assertArrayEquals("it should return '" + Arrays.toString(result) + "'", result, MexicanWave.wave("two words")); } @Test public void basicTest5() { String[] result = new String[] { " Gap ", " gAp ", " gaP " }; assertArrayEquals("it should return '" + Arrays.toString(result) + "'", result, MexicanWave.wave(" gap ")); } }
Code language: Java (java)

The solution in Java

public class MexicanWave { public static String[] wave(String str) { // get the length of the string without spaces int lenwos = str.replaceAll("\\s","").length(); // the final answer String[] out = new String[lenwos]; // the counter to populate to int j=0; // while looping through the input string for (int i=0; i<str.length(); i++) { // if we detect a space, just increment our character counter while (Character.toString(str.charAt(i)).equals(" ")) { // return if about to be out of bounds if ((i+1)>=str.length()) return out; i++; } // create our new string StringBuilder sb = new StringBuilder(str); // uppercase the correct character sb.setCharAt(i, Character.toUpperCase(str.charAt(i))); // convert to string out[j] = sb.toString(); // increment the answer counter j++; } // return the answer return out; } }
Code language: Java (java)

You could also do the whole thing in an IntStream as follows:

import java.util.stream.IntStream; public class MexicanWave { public static String[] wave(String str) { return IntStream .range(0, str.length()) .mapToObj(x -> new StringBuilder(str).replace(x, x+1, String.valueOf(str.charAt(x)).toUpperCase()).toString()) .filter(x -> !x.equals(str)) .toArray(String[]::new); } }
Code language: Java (java)
Tags:
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments