剑指 Offer算法题

@本博客内容为网上搜集,是个人的学习笔记,非原创性内容,如有冒犯,请联系我撤除!

剑指 Offer算法题

第四题:

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

注意:有几个空格就替换几个空格,如果有连续两个空格也要分别用%20替换

答案:

  • 方法一:

配合StringBuffer 的indexOf方法和replace方法。 但是StringBuffer没有方法来判断str里面是否有空格,所以先转换为字符串判断是否有空格。

实现代码:

public class Solution {
    public String replaceSpace(StringBuffer str) {
        String result = str.toString();
        if(result.contains(" ")){
            while(str.indexOf(" ") != str.lastIndexOf(" ")){
            int index = str.indexOf(" ");
            str.replace(index,index+1,"%20");
        }
            int index = str.indexOf(" ");
            str.replace(index,index+1,"%20");
            result = str.toString();
            return result;

        }else{
            return result;
        }
    }
}
  • 方法二:对一的改进

StringBuffer的indexOf方法找不到时返回值为-1,那么直接使用-1 来做判断代码简单很多。

public class Solution {
    public String replaceSpace(StringBuffer str) {
        int index = str.indexOf(" ");
        while(index != -1){
            str.replace(index,index+1,"%20");
            index = str.indexOf(" ",index);
        }
        String result = str.toString();
        return result;

    }
}
  • 方法三:

不调用replace方法实现

public class Solution {
    public String replaceSpace(StringBuffer str) {
        int n = str.length();//字符串的长度 
        int ii = 0;//空格的个数ii 
        for(int i = 0;i < n;i++){ 
            //检测空格 
            if(str.charAt(i)==' '){ 
                ii++; 
            } 
        } 

        int nn = 2 * ii + n;//根据空格的个数,得到新数组的长度 
        int index = nn -1; 
        char[] ct = new char[nn];//新建数组 
        while(n > 0){ 
            if(str.charAt(n - 1) != ' '){ 
                //如果不是空格 
                ct[index--] = str.charAt(n-1); 
            } 
            else{ 
                //如果是空格 
                ct[index--] = '0'; 
                ct[index--] = '2'; 
                ct[index--] = '%'; 
            } 
            //取下一个字符 
            n--; 
        } 
        return String.valueOf(ct);//将字符数组转为String类型后返回 

    }
}

方法四:CN-Notes

在字符串尾部填充任意字符,使得字符串的长度等于替换之后的长度。因为一个空格要替换成三个字符(%20),因此当遍历到一个空格时,需要在尾部填充两个任意字符。令 P1 指向字符串原来的末尾位置,P2 指向字符串现在的末尾位置。P1 和 P2 从后向前遍历,当 P1 遍历到一个空格时,就需要令 P2 指向的位置依次填充 02%(注意是逆序的),否则就填充上 P1 指向字符的值。从后向前遍是为了在改变 P2 所指向的内容时,不会影响到 P1 遍历原来字符串的内容。


public String replaceSpace(StringBuffer str) {
    int P1 = str.length() - 1;
    for (int i = 0; i <= P1; i++)
        if (str.charAt(i) == ' ')
            str.append("  ");

    int P2 = str.length() - 1;
    while (P1 >= 0 && P2 > P1) {
        char c = str.charAt(P1--);
        if (c == ' ') {
            str.setCharAt(P2--, '0');
            str.setCharAt(P2--, '2');
            str.setCharAt(P2--, '%');
        } else {
            str.setCharAt(P2--, c);
        }
    }
    return str.toString();}

你可能感兴趣的:(剑指 Offer算法题)