Opal
Opal

Reputation: 491

Write a method to replace all spaces in a string with '%20'?

I have a question about a programming problem from the book Cracking The Code Interview by Gayl Laakmann McDowell, 5th Edition.

I'm not sure what is wrong with my answer? It varies a lot from the answer given in the book.

public String replace(String str){

   String[] words = str.split(" ");
   StringBuffer sentence = new StringBuffer();

   for(String w: words){
      sentence.append("%20");
      sentence.append(w);
   }

  return sentence.toString();
}

Upvotes: 4

Views: 10168

Answers (7)

NANCY
NANCY

Reputation: 61

public static String replaceSpaceInString(String string,String toreplace){
    String replacedString = "";
    if(string.isEmpty()) return string;
    string = string.trim();
    if(string.indexOf(" ") == -1)return string;
    else{
        replacedString = string.replaceAll("\\s+",toreplace);
    }
    return replacedString;
}

Upvotes: 0

Box
Box

Reputation: 113

I am using matches and replaceAll it works well.

public class ReplaceSpaces {

public static void main(String[] args) {

    String text = " Abcd olmp  thv ";

    if(text.matches(".*\\s+.*")){
        System.out.println("Yes I see white space and I am replacing it");
        String newText = text.replaceAll("\\s+", "%20");
        System.out.println(newText);
    }
    else{
        System.out.println("Nope I dont see white spaces");
    }
}
}

Output Yes I see white space and I am replacing it %20Abcd%20olmp%20thv%20

Upvotes: 0

user3743369
user3743369

Reputation: 61

private static String applyReplaceOperationWithCount(String str) {
    if (StringUtils.isEmpty(str)) { //if string is null or empty, return it
        return str;
    }
    char[] strChar = str.toCharArray(); 

    int count = 0; //count spaces in the string to recalculate the array length
    for (char c : strChar) {
        if (c == ' ') {
            count++;
        }
    }

    if (count == 0) { // if there are no spaces in the string, return it 
        return str;
    }

    int length = strChar.length;
    char[] newChar = new char[length + (count * 2)]; // 1 char will be replaced by 3 chars. So the new length should be count*2 larger than original
    int index = 0;
    for (char c : strChar) { 
        if (c != ' ') { // if char is not a space just push it in the next available location
            newChar[index++] = c;
        } else { // if char is a space just push %,2,0 
            newChar[index++] = '%';
            newChar[index++] = '2';
            newChar[index++] = '0';
        }
    }
    return new String(newChar); // convert the new array into string
}

Upvotes: 0

imvp
imvp

Reputation: 123

One of the simplest way:

public void replaceAll( String str )
{
    String temp = str.trim();

    char[] arr = temp.toCharArray();
    StringBuffer sb = new StringBuffer();

    for( int i = 0; i < arr.length; i++ )
    {
        if( arr[i] == ' ' )
        {
            sb.append( "%20" );
        }
        else
        {
            sb.append( arr[i] );
        }
    }
}

Upvotes: 1

MD-11
MD-11

Reputation: 941

Question in the book says:

Note: if implementing in Java, please use a character array so that you can perform this operation in place.

It also says that the char array that you get as input is long enough to hold the modified string.
By using split and StringBuffer you use additional O(n) space. That's why your answer varies a lot and is incorrect (apart from adding additional "%20").

Upvotes: 6

janos
janos

Reputation: 124646

In this loop, the program adds %20 before each word:

   for(String w: words){
      sentence.append("%20");
      sentence.append(w);
   }

That will produce incorrect results, for example for a b it will give %20a%20b.

There's a much simpler solution:

public String replace(String str) {
    return str.replaceAll(" ", "%20");
}

Or, if you really don't want to use .replaceAll, then write like this:

public String replace(String str) {
    String[] words = str.split(" ");
    StringBuilder sentence = new StringBuilder(words[0]);

    for (int i = 1; i < words.length; ++i) {
        sentence.append("%20");
        sentence.append(words[i]);
    }

    return sentence.toString();
}

Upvotes: 5

arynaq
arynaq

Reputation: 6870

You can also do the following, which replaces any space

String s = "Hello this is a       string!";
System.out.println(replaceSpace(s, "%20"));


public static String replaceSpace(String s, String replacement) {
    String ret = s.replaceAll("  *", replacement);
    return ret;
}

Gives

Hello%20this%20is%20a%20string!

Upvotes: 1

Related Questions