CodingBat: Java. String-2, Part II

repeatFront:

public String repeatFront(String str, int n) {
	String res = "";
	for (int i = n; i > 0; i--)
		res += str.substring(0, i);
	return res;
}

repeatSeparator:

public String repeatSeparator(String word, String sep, int count) {
	String res = "";
	if (count == 0) return "";
	while (count > 1) {
		res += word + sep;
		count--;
	}
	return res + word;
}

prefixAgain:

public boolean prefixAgain(String str, int n) {
	String prefix = str.substring(0, n);
	for (int i = n; i <= str.length() - prefix.length(); i++)
		if (str.substring(i, i + prefix.length()).equals(prefix))
			return true;
	return false;
}

xyzMiddle:

public boolean xyzMiddle(String str) {
	int len = str.length();
	if (len < 3) return false;
	if (len % 2 == 1)
		return str.substring(len/2 - 1, len/2 + 2).equals("xyz");
	return str.substring(len/2 - 2, len/2 + 1).equals("xyz") 
			|| str.substring(len/2 - 1, len/2 + 2).equals("xyz");
}  

getSandwich:

public String getSandwich(String str) {  
	int first = str.indexOf("bread");
	int last = str.lastIndexOf("bread");
	if (first == last) return "";
	return str.substring(first+5, last);
}

sameStarChar:

public boolean sameStarChar(String str) {  
	for (int i = 1; i < str.length()-1; i++)
		if (str.charAt(i) == '*' && str.charAt(i-1) != str.charAt(i+1))
			return false;
	return true;
}

zipZap:

public String zipZap(String str) {
	for (int i = 0; i < str.length()-2; i++)
		if (str.charAt(i) == 'z' && str.charAt(i+2) == 'p')
			str = str.substring(0,i+1) + str.substring(i+2);
	return str;
}

starOut:

public String starOut(String str) {	
	while (str.indexOf('*') != -1) {
		if (str.equals("*")) return "";
		int starPos = str.indexOf('*');
		int secondStar = str.indexOf('*', starPos+1);
		if (secondStar - starPos == 1) {
			str = str.substring(0,starPos) + str.substring(secondStar);
			continue;
		}
		if (starPos == 0) str = str.substring(starPos+2);
		else if (starPos == str.length()-1)
			str = str.substring(0, str.length()-2);
		else str = str.substring(0, starPos-1) + str.substring(starPos+2);
	}
	return str;
}

plusOut:

public String plusOut(String str, String word) {
	int start = 0;
	int end = str.indexOf(word);
	while (end != -1) {
		for (int i = start; i < end; i++)
			str = str.substring(0,i) + "+" + str.substring(i+1);
		start = end + word.length();
		end = str.indexOf(word, start);
	}
	for (int i = start; i < str.length(); i++)
		str = str.substring(0,i) + "+" + str.substring(i+1);
	return str;
}

wordEnds:

public String wordEnds(String str, String word) {
	String res = "";
	int pos = str.indexOf(word);
	while (pos != -1) {
		if (pos != 0) res += str.charAt(pos-1);
		if (pos + word.length() == str.length()) break; 
		res += str.charAt(pos + word.length());
		pos = str.indexOf(word, pos+1);
	}
	return res; 
}

18 thoughts on “CodingBat: Java. String-2, Part II

  1. Maxim

    I don’t think you’re supposed to use more than 1 loop in the String-2 problem section. This is my solution for plusOut:

    public String plusOut(String str, String word) {
    String res = “”;
    int found = str.indexOf(word);

    for (int i = 0; i < str.length(); i++) {
    if (i == found) {
    res += word;
    found = str.indexOf(word, found + word.length());
    i += word.length()-1;
    } else {
    res += "+";
    }
    }

    return res;
    }

    Reply
    1. Simon Lahn

      Here’s my solution using the equals method. It requires one less variable.

      public String plusOut(String str, String word) {
      String result = “”;

      for (int i = 0; i < str.length(); i++) {
      //ensure there is no out of bounds and compare substring with word
      if(i + word.length() <= str.length() && str.substring(i, i + word.length()).equals(word)){
      result += word;

      //increment i by word length minus one since the for loop already increments i by 1
      i += word.length() – 1;
      }
      //Otherwise add a "+" and continue to increment i
      else
      result += "+";
      }

      return result;
      }

      Reply
  2. Stephan

    I don’t see an answer for the program oneTwo.
    Here is what i got:
    public static String oneTwo(String str) {
    String result = “”;

    for (int i = 0; i < str.length() – 2; i++) {
    if (i == 0 || i % 3 == 0) {
    result += str.substring(i + 1, i + 3);
    result += str.charAt(i);
    }
    }
    return result;

    Reply
    1. Chau Nguyen

      You can do this instead!

      public String oneTwo(String str) {
      if (str.length() < 3) return ""; // this part doesn't matter too much

      String result = "";

      for (int i = 0; i < str.length() – 2; i += 3)
      result = result + str.substring(i + 1, i + 3) + str.substring(i, i + 1);

      return result;
      }

      Reply
  3. Dave

    for prefix again i just used one return function:

    return(str.lastIndexOf(str.substring(0,n)) != str.indexOf(str.substring(0,n)));

    Reply
      1. Gregor Ulm Post author

        This is about as unreadable than the version of Dave. When you start out with programming, you may want to avoid picking up bad habits, such as questionable conciseness.

        Reply
  4. nick woodward

    Hi,

    Would you mind explaining your solution to starOut a little please? I’m struggling to follow it.

    Here’s my version:

    public String starOut(String str) {
    String temp = “”;

    for(int x = 0; x < str.length(); x++){
    //check previous
    if(x != 0 && str.charAt(x-1) == '*') continue;
    //check next
    if(x+1 < str.length() && str.charAt(x+1)=='*') continue;
    //check current
    temp += str.charAt(x)=='*'? "":str.charAt(x);
    }
    return temp;
    }

    Regards,

    Reply
  5. nick woodward

    just working through your ‘wordEnds’ solution too. nice.

    any thoughts on this way? (other than the tertiary operator being a little less legible)

    public String wordEnds(String str, String word) {
    String temp = “”;

    for(int x = 0; x < str.length(); x++){
    //check previous
    if(x != 0 && x + word.length() <= str.length())
    temp += str.substring(x,x+word.length()).equals(word)? str.substring(x-1,x):"";

    if(x + word.length()+1 <= str.length()){
    //check next
    temp += str.substring(x,x+word.length()).equals(word)? str.substring(x+ word.length(),x+word.length()+1):"";
    }
    } return temp;
    }

    regards,

    nick

    Reply
    1. Gelo

      we have almost same idea. here’s my solution:
      public String wordEnds(String str, String word) {

      String snip = “”;
      for(int i=0; i<str.length()-word.length()+1; i++){
      String s = str.substring(i, i+word.length());

      if(i != 0 && s.equals(word)){
      String s2 = str.substring(i-1, i);
      snip += s2;
      }

      if(i != str.length()-word.length() && s.equals(word)){
      String s3 = str.substring(i+word.length(), i+word.length()+1);
      snip += s3;
      }
      }
      return snip;
      }

      Reply
  6. Suraj

    I have another solution to plusOut
    public String plusOut(String str, String word) {

    char[] arr = str.toCharArray();
    Arrays.fill(arr,’+’);

    for(int i = 0 ; i < str.length() – word.length() +1 ; i++){
    if(str.substring(i , i + word.length()).equals(word)){
    int p = i;
    for(int k = 0 ; k < word.length() ; k++)
    arr[p++] = word.charAt(k);
    }
    }
    return new String(arr);
    }

    Reply
  7. Suraj

    starOut : Another solution

    public String starOut(String str) {
    return str.replaceAll(“.?\\*+.?”,””);
    }

    Note : .?\\*+.?
    .? => zero or one character (for boundary cases)
    \\*+ => one or more star

    Reply
    1. Gregor Ulm Post author

      If I recall correctly, replaceAll() is not part of the methods Nick Parlante mentions on the Coding Bat website. Thus, using it defeats the purpose of the exercise.

      Reply
  8. Kyran

    For prefixAgain, couldn’t you just avoid looping altogether with this? Bit of a newb, but I figure it’d be quicker to run (marginally)

    public boolean prefixAgain(String str, int n) {
    boolean res = false;
    String s = str.substring(0,n);

    if (str.lastIndexOf(s)>=n)
    {
    res = true;
    }
    return res;
    }

    Reply
  9. Simon

    I look at these solutions only after I’ve figured it out on my own only to realize I tend to over complicate the problem. What takes me 10+ lines, you manage to do in four lines. Thanks for the solutions.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

Spammer prevention; the answer is an integer: * Time limit is exhausted. Please reload CAPTCHA.