• 剑指02.替换空格


    题目描述

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

    思路:

    解法一:调用自带函数str.toString().replace(" ","%20")。

    解法二:在当前字符串上进行替换。

    1. 先计算替换后的字符串需要多大的空间,并对原字符串空间进行扩容;
    2. 从后往前替换字符串的话,所有的字符都只复制(移动)一次,时间复杂度是O(n);
    3. 如果从前往后替换,每个字符串需要多次移动,效率较低。

    解法三:开辟一个新的字符串。当遇到 " ",就追加 "%20",否则遇到什么追加什么。

    总结:  在合并两个数组(包括字符串)时,如果从前往后复制每个数字(或字符)则需要重复移动数字(或字符)多次,那么可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率。

    解法一

    public class Solution {
        public String replaceSpace(StringBuffer str) {
            return str.toString().replace(" ","%20");      
        }
    }

    解法二

    public class Solution {
        public String replaceSpace(StringBuffer str) {
            //originalLength为字符串的实际长度
            int originalLength = str.length();
            int spaceNum = 0;
            for (int i = 0; i < str.length(); i++){
                if (str.charAt(i) == ' '){
                    spaceNum++;
                }
            }
            //newLength为把空格替换成'%20'之后的长度
            int newLength = originalLength + spaceNum * 2;
            str.setLength(newLength);  //对StringBuffer扩容!!
            int indexOfOriginal = originalLength - 1;
            int indexOfNew = newLength - 1;
            while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal){
                if (str.charAt(indexOfOriginal) == ' '){
                    str.setCharAt(indexOfNew--, '0'); //注意setCharAt与insert的区别,insert对该位置及之后的元素向后平移,然后插入新元素。
                    str.setCharAt(indexOfNew--, '2');
                    str.setCharAt(indexOfNew--, '%');
                }else{
                    str.setCharAt(indexOfNew--,str.charAt(indexOfOriginal));
                }
                indexOfOriginal --;
            }
            return str.toString();
        }
    }

    解法三

    public class Solution {
        public String replaceSpace(StringBuffer str) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < str.length(); i++){
                if (str.charAt(i) == ' '){
                    sb.append("%20");
                }else{
                    sb.append(str.charAt(i));
                }
            }
            return sb.toString();
        }
    }

     

    知识点扩展——StringBuffer常用方法

    public class StringBufferBuilderTest {
        public static void main(String[] args) {
            StringBuffer sf=new StringBuffer();
    //        用于字符串拼接
            sf.append("ab");
            sf.append(25);
            System.out.println(sf);
    //        删除指定位置的内容 [start,end)
            sf.delete(4,6);
            System.out.println(sf);
    //        把[start,end)位置替换为str
            sf.replace(1,3,"we");
            System.out.println(sf);
    //        在指定位置插入数据
            sf.insert(2,"xxx");
            System.out.println(sf);
    //        截取[start,end)字符串
            System.out.println(sf.substring(1,5));
    //        返回字符串长度
            System.out.println(sf.length());
    //        获取索引为1的字符
            System.out.println(sf.charAt(1));
    //        将索引为1处的值替换为'm'
        sf.setCharAt(1,'m');
            System.out.println(sf);
    //        将字符串翻转
            System.out.println(sf.reverse());
        }
    }
  • 相关阅读:
    VUE单页模板
    Nacos(作为配置中心)
    OpenFeign与Nacos(作为注册中心) 远程调用
    Nacos 服务注册
    Docker 安装Redis
    Docker安装Mysql
    多线程之CAS和ABA
    Volatile
    JAVA语言的特点
    判断多选按钮被选中两种方法
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/13424588.html
Copyright © 2020-2023  润新知