string challenge

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"

LVL 7
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
return str.replaceAll("(.).{0,"+(n-1)+"}","\$1");
0
Commented:
everyNth("Miracle", 2) → "Mrce"
everyNth("abcdefg", 2) → "aceg"
0
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
Commented:
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
Author Commented:
``````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
Author Commented:
``````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
Commented:
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
Author Commented:
``````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
Commented:
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
Author Commented:
``````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
Commented:
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
Author Commented:
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
Commented:
Consider why do you need both str2 and s?

Hint: you don't
0

Experts Exchange Solution brought to you by

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Author Commented:
``````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