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?
 
ozoConnect With a Mentor Commented:
Consider why do you need both str2 and s?

Hint: you don't
0
 
ozoCommented:
return str.replaceAll("(.).{0,"+(n-1)+"}","$1");
0
 
ozoCommented:
everyNth("Miracle", 2) → "Mrce"
everyNth("abcdefg", 2) → "aceg"
everyNth("abcdefg", 3) → "adg"
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
GeisrudConnect With a Mentor Systems 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
 
dpearsonConnect With a Mentor 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
 
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
 
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
All Courses

From novice to tech pro — start learning today.