alternate strings challenge

Hi,

I was working on below challenge

http://codingbat.com/prob/p165666

I wrote as below

public String stringBits(String str) {
  for(int i=0;i<str.length()-1;i=i++){
  String s="";
  return (s+str.substring(i,i+2));  
  }
  return null;
}

Open in new window

I got output as below

Expected      Run            
stringBits("Hello") → "Hlo"      "He"      X         
stringBits("Hi") → "H"      "Hi"      X         
stringBits("Heeololeo") → "Hello"      "He"      X         
stringBits("HiHiHi") → "HHH"      "Hi"      X         
stringBits("") → ""      "null"      X         
stringBits("Greetings") → "Getns"      "Gr"      X         
stringBits("Chocoate") → "Coot"      "Ch"      X         
stringBits("pi") → "p"      "pi"      X         
stringBits("Hello Kitten") → "HloKte"      "He"      X         
stringBits("hxaxpxpxy") → "happy"      "hx"      X         



How to improve it and fix it. Please advise
LVL 7
gudii9Asked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
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.

krakatoaCommented:
Try this:

public String stringBits(String str) {
  StringBuilder sb = new StringBuilder();
  for (int y=0;y<(str.length());y=y+2){
  sb.append(str.charAt(y));
  }
  return sb.toString();
}

Open in new window

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
n2fcCommented:
public String stringBits(String str) {
  String s="";
  for(int i=0;i<str.length();i+=2)
      s=s+str.substring(i,i+1);  
  
return s;
}

Open in new window

n2fcCommented:
As an alternative:

public String stringBits(String str) {
  String s="";
  for(int i=0; i<str.length(); ++i)
       s+=str.substring(i, ++i);  
  
  return s;
}

Open in new window


See if you can tell why they BOTH work!!
Bootstrap 4: Exploring New Features

Learn how to use and navigate the new features included in Bootstrap 4, the most popular HTML, CSS, and JavaScript framework for developing responsive, mobile-first websites.

gudii9Author Commented:
public String stringBits(String str) {
  for(int i=0;i<str.length()-1;i=i++){
  String s="";
  return (s+str.substring(i,i+2));  
  }
  return null;
}







public String stringBits(String str) {
  String s="";
  for(int i=0;i<str.length();i+=2)
      s=s+str.substring(i,i+1);  
  
return s;
}

Open in new window



comparing my solution with your solution as above both looks almost similar except in the increment i wrote i=i+1 and inside for loop i=i+2 (where as yours i=i+2 and i=i+1) . I wonder what is the difference.


I also made my usual mistake
i<str.length()-1

I though i represent like index so it is 1 less than original length.

Please advise
gudii9Author Commented:
for (int y=0;y<(str.length());y=y+2){
  sb.append(str.charAt(y));

Is y is not like index (index always starts with 0 so we take str.length()-1) but we are taking y<(str.length())
Please advise
ozoCommented:
Another mistake, is that i=i++ does not do what you seem to think it does
krakatoaCommented:
Is y is not like index (index  . . .

Right well consider this - the word "Hello". The index starts at zero as you say, so this is character 'H'. Then we add 2 to that, so that points at character 'l', then, because 'y' is now 2, and 2 is still less than 5 (the length of the string 'Hello'), we again add 2 to 'y', making it 4, and take the 4th index character, which is 'o', and so we get 'Hlo'. Now, if 2 is added to 'y', it will exceed the string length, and so this brings the loop to a halt.
krakatoaCommented:
gudii - do me this favour will you - answer these 5 questions, based on the string "Hello". :

1. What is the index number of the beginning of the string?

2. What is the index number of the end of the string ?

3. What is the length of the string?

4. What is the MAXIMUM value that this expression can return for 'y' ? : y<"Hello".length()  

5. What is the difference between the values of your answers to points 4 and point 2 above?
gudii9Author Commented:
1. What is the index number of the beginning of the string?
>>0

2. What is the index number of the end of the string ?
>>4

3. What is the length of the string?
>>5
4. What is the MAXIMUM value that this expression can return for 'y' ? : y<"Hello".length()  
>>5(since "Hello".length()  is 5)

5. What is the difference between the values of your answers to points 4 and point 2 above?
>>sorry i did not clearly understand this. point 4 gives answer as 5 and point 2 gives answer as 4 so both lenght and index are different and index is always one less than length
gudii9Author Commented:
Right well consider this - the word "Hello". The index starts at zero as you say, so this is character 'H'. Then we add 2 to that, so that points at character 'l', then, because 'y' is now 2, and 2 is still less than 5 (the length of the string 'Hello'), we again add 2 to 'y', making it 4, and take the 4th index character, which is 'o', and so we get 'Hlo'. Now, if 2 is added to 'y', it will exceed the string length, and so this brings the loop to a halt.

this explanation is very clear. I was jumping by mistake to next character rather than alternate character whose difference is 2 not1
n2fcCommented:
comparing my solution with your solution as above both looks almost similar except in the increment i wrote i=i+1 and inside for loop i=i+2 (where as yours i=i+2 and i=i+1) . I wonder what is the difference.


I also made my usual mistake
i<str.length()-1

I though i represent like index so it is 1 less than original length.

I think your best bet to figure this out would be to "hand test" by making  a table of every assignment change to see where your values are awry...

Think about what you are doing in the loop!

Putting your "return" INSIDE the loop makes NO SENSE!  It would STOP looping the first time it hits it!  Compare to the OTHER solutions offered that build up the proper answer and only then returns that answer AFTER the loop completes...

You also need to understand the way "++i" "i++" and "i=i++" work... go over these operators in a good C or Java language reference...
krakatoaCommented:
You got my point 4 wrong. Look at it again more carefully.
krakatoaCommented:
Because not understanding my question 4 is, I believe, the reason you are having trouble, so if you can deal with this point I think you will make progress.
gudii9Author Commented:
'y' ? : y<"Hello".length()

Is it is ternary operator(looks like that to me with ? and :

It also does not look like that since there is no two separate entities corresponding to condition true and false.

Please advise
krakatoaCommented:
y<"Hello".length()


IS THE EXPRESSION!!!!!!!!!!!!!


Im am asking you the max value of y !!!!
ozoCommented:
I think krakatoa means max value of y for which the expression is true
gudii9Author Commented:
oh that is  6
ozoCommented:
Is this true?
6<"Hello".length()
gudii9Author Commented:
oh i made a mistake. I understand the question now. So the y can go maximum upto 4. It if goes beyond 4 say 5  or 6 etc the condition returns false
krakatoaCommented:
oh i made a mistake. I understand the question now. So the y can go maximum upto 4. It if goes beyond 4 say 5  or 6 etc the condition returns false

That's it ! y's maximum value can be 4 - the highest number that is less than 5, . And 5, as you know, is the length of the string.
gudii9Author Commented:
public String stringBits(String str) {
  String s="";
  for(int i=0;i<str.length();i+=2)
      s=s+str.substring(i,i+1);  
  
return s;
}





public String stringBits(String str) {
  String s="";
  for(int i=0; i<str.length(); ++i)
       s+=str.substring(i, ++i);  
  
  return s;
}

Open in new window


Both of above scenarios working since we are incrementing first then assigning to i in the second scenario which makes it equivalent to fist scenario
krakatoaCommented:
Yes, they both work. But your two examples are making the code more difficult to read than it needs to be, because you can make it easier to understand I would say, if you use StringBuilder and follow the example I gave originally.

(It's good that you made the two pieces of code work, but as someone great once said, 'you should make things as simple as possible, and no simpler'.
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.