Solved

# string challenge

Posted on 2014-10-10
224 Views
Hi,

I was trying below challenge

http://codingbat.com/prob/p196441

I did not understand the requirement to proceed.

Given a non-empty string and an int N, return the string made starting with char 0, and then every Nth char of the string. So if N is 3, use char 0, 3, 6, ... and so on. N is 1 or more.

everyNth("Miracle", 2) → "Mrce"
everyNth("abcdefg", 2) → "aceg"

0
Question by:gudii9

LVL 84

Expert Comment

return str.replaceAll("(.).{0,"+(n-1)+"}","\$1");
0

LVL 84

Expert Comment

everyNth("Miracle", 2) → "Mrce"
everyNth("abcdefg", 2) → "aceg"
0

LVL 14

Assisted Solution

Geisrud earned 100 total points
Here's my algorithm/solution (does the same thing as Ozo's solution, but my Java-Fu is weak, unoptimized, and overly verbose):

*Create a new String to hold the result.
*Use a for loop to parse through the string str they give you.
*At each n grab that char and append it to your new string
0

LVL 26

Assisted Solution

dpearson earned 100 total points
You may find a loop like this gets you started...

for (int pos = 0 ; pos < str.length() ; pos += n) {
// Add the character at 'pos' to the output
}

Doug
0

LVL 7

Author Comment

``````public String everyNth(String str, int n) {
String s="";
for (int pos = 0 ; pos < str.length() ; pos += n) {
// Add the character at 'pos' to the output

return (s+str.substring(pos-1, pos));
}
return null;
}
``````

I tried as above
Test cases failing as below

Expected      Run
everyNth("Miracle", 2) → "Mrce"      "Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (line number:6)"      X
everyNth("abcdefg", 2) → "aceg"      "Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (line number:6)"      X
everyNth("abcdefg", 3) → "adg"      "Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (line number:6)"      X
everyNth("Chocolate", 3) → "Cca"      "Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (line number:6)"      X
everyNth("Chocolates", 3) → "Ccas"      "Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (line number:6)"      X
everyNth("Chocolates", 4) → "Coe"      "Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (line number:6)"      X
everyNth("Chocolates", 100) → "C"      "Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (line number:6)"

0

LVL 7

Author Comment

``````public class TEst13 {

public static void main(String[] args) {
// TODO Auto-generated method stub
everyNth("hello", 2);
}

public static String everyNth(String str, int n) {
String s="";
for (int pos = 0 ; pos < str.length() ; pos += n) {
// Add the character at 'pos' to the output

return (s+str.substring(pos-1, pos));
}
return null;
}

}
``````

i get

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at TEst13.everyNth(TEst13.java:14)
at TEst13.main(TEst13.java:6)
0

LVL 84

Expert Comment

If you write it that way, you'd want to start at pos=0

You also don't want to do the return inside the loop
0

LVL 7

Author Comment

``````public class Test10 {

public static void main(String[] args) {
// TODO Auto-generated method stub
everyNth("hello", 2);
}

public static String everyNth(String str, int n) {
String s="";
String str2 = null;
for (int pos = 0 ; pos < str.length() ; pos += n) {
// Add the character at 'pos' to the output

str2=(s+str.substring(pos-1, pos));
}
return str2;
}

}
``````

i moved return to outside. I thought i started at pos is 0 since my for loop checks pos=0.

0

LVL 84

Expert Comment

pos=0
Sorry, I meant to say pos = 1
but rather than adjust that part, it may be preferable to change
(pos-1, pos) to (pos, pos+1)
that way the end condition wouldn't need to be adjusted too.

You are getting closer, but when you see the results, consider also why you are using both s and str2.
0

LVL 7

Author Comment

``````public class Test10 {

public static void main(String[] args) {
// TODO Auto-generated method stub
String str3=everyNth("hello", 2);
System.out.println("str3 value is"+str3);
}

public static String everyNth(String str, int n) {
String s="";
String str2 = null;
for (int pos = 0 ; pos < str.length() ; pos += n) {//i see length as 5 and pos started at 0
// Add the character at 'pos' to the output

str2=(s+str.substring(pos, pos+1));
}
return str2;
}

}
``````

i modified further.

when i debug on eclipse i see h  then l then o

but my output only gives o
Console output is

str3 value iso
0

LVL 84

Expert Comment

Do you see why you only get o?  Do you understand what happened to the h then l?
Can you think of a way to get them in the output?
0

LVL 7

Author Comment

somehow it is putting only last character not the before ones(it is kind of overriding before ones not sure why yet)

something needs to be tweaked below

str2=(s+str.substring(pos, pos+1));

not sure yet what
0

LVL 84

Accepted Solution

ozo earned 300 total points
Consider why do you need both str2 and s?

Hint: you don't
0

LVL 7

Author Comment

``````public class Test11 {

public static void main(String[] args) {
// TODO Auto-generated method stub
String str3=everyNth("Miracle", 2);
System.out.println("str3 value is-->"+str3);
}

public static String everyNth(String str, int n) {
String s="";
//String str2 = null;
for (int pos = 0 ; pos < str.length() ; pos += n) {//i see length as 5 and pos started at 0
// Add the character at 'pos' to the output

s=(s+str.substring(pos, pos+1));
}
return s;
}

}
``````

you are right. i removed the extra one and concatenated to same string 's'

now all test cases are happy

Expected      Run
everyNth("Miracle", 2) → "Mrce"      "Mrce"      OK
everyNth("abcdefg", 2) → "aceg"      "aceg"      OK
everyNth("Chocolate", 3) → "Cca"      "Cca"      OK
everyNth("Chocolates", 3) → "Ccas"      "Ccas"      OK
everyNth("Chocolates", 4) → "Coe"      "Coe"      OK
everyNth("Chocolates", 100) → "C"      "C"      OK
0

## Featured Post

Introduction Java can be integrated with native programs using an interface called JNI(Java Native Interface). Native programs are programs which can directly run on the processor. JNI is simply a naming and calling convention so that the JVM (Java…
This article is meant to give a basic understanding of how to use R Sweave as a way to merge LaTeX and R code seamlessly into one presentable document.
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …