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"
everyNth("abcdefg", 3) → "adg"


 Please advise
LVL 7
gudii9Asked:
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.

ozoCommented:
return str.replaceAll("(.).{0,"+(n-1)+"}","$1");
0
ozoCommented:
everyNth("Miracle", 2) → "Mrce"
everyNth("abcdefg", 2) → "aceg"
everyNth("abcdefg", 3) → "adg"
0
Joe RudSystems AdministratorCommented:
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
*Return your string
0
Cloud Class® Course: Microsoft Windows 7 Basic

This introductory course to Windows 7 environment will teach you about working with the Windows operating system. You will learn about basic functions including start menu; the desktop; managing files, folders, and libraries.

dpearsonCommented:
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
gudii9Author 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;
}

Open in new window


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)"


Please advise
0
gudii9Author 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;
		}

}

Open in new window


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
ozoCommented:
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
gudii9Author 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;
		}

}

Open in new window


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

Please advise
0
ozoCommented:
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
gudii9Author 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;
		}

}

Open in new window


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
ozoCommented:
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
gudii9Author 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
ozoCommented:
Consider why do you need both str2 and s?

Hint: you don't
0

Experts Exchange Solution brought to you by

Your issues matter to us.

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

Start your 7-day free trial
gudii9Author 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;
		}

}

Open in new window


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("abcdefg", 3) → "adg"      "adg"      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
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.