For further help with Coding Bat (Java), please check out my books. I am also available for tutoring.
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; } [/sourcecode] <b>xyzMiddle:</b> [sourcecode language="Java" gutter="false"] 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"); } [/sourcecode] <b>getSandwich:</b> [sourcecode language="Java" gutter="false"] 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; } [/sourcecode] <b>zipZap:</b> [sourcecode language="Java" gutter="false"] 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; } [/sourcecode] <b>starOut:</b> [sourcecode language="Java" gutter="false"] 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; }[/sourcecode] <b>wordEnds:</b> [sourcecode language="Java" gutter="false"] 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; }
For further help with Coding Bat (Java), please check out my books. I am also available for tutoring.
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;
}
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;
}
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;
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;
}
woops, instead of “str.substring(i, i + 1)” just use “str.charAt(i)”
Amazing.
i really like that one.
thank you for sharing.
for prefix again i just used one return function:
return(str.lastIndexOf(str.substring(0,n)) != str.indexOf(str.substring(0,n)));
This can be shortened to:
return (str.indexOf(str.substring(0,n), 1) != -1);
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.
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,
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
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;
}
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);
}
At this point in Coding Bat, arrays have not yet been introduced.
starOut : Another solution
public String starOut(String str) {
return str.replaceAll(“.?\\*+.?”,””);
}
Note : .?\\*+.?
.? => zero or one character (for boundary cases)
\\*+ => one or more star
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.
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;
}
How do you think lastIndexOf() might be implemented?
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.
public String repeatSeparator(String word, String sep, int count) {
String result = “”;
for(int i=0; i<count; i++)
result = String.join(sep,word,result);
if(result.endsWith(sep)) return result.substring(0,result.length()-sep.length());
return result;
}
My solution
public boolean prefixAgain(String str, int n) {
String end = str.substring(n);
return end.contains(str.substring(0,n));
}
My solution
public String getSandwich(String str) {
if(str.length()<=10) return "";
return str.substring(str.indexOf("bread")+5,str.lastIndexOf("bread"));
}
Can anybody explain to me what is happening in the code for repeatfront. It would be very helpful.
public Boolean prefixAgain(String str, int n) {
return str.substring(n).contains(str.substring(0,n));
}