• P44、面试题4:替换空格


    题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。

      如果用java string类中提供的replace方法可以很快的进行替换。

    代码实现:

    package com.yyq;
    
    /**
     * Created by Administrator on 2015/9/4.
     */
    public class ReplaceBlank {
        public static void main(String args[]){
            String str = "we are happy";
            String newStr = str.replace(" ","%20");
            System.out.println(newStr);
        }
    }

    如果是按照很原始的方法进行替换的话,里面包含着大技巧。

    我们可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来长度加上2乘以空格数目。从字符串的后面开始复制和替换,直到都走到字符串首位。

    代码实现:

    package com.yyq;
    
    import java.util.Arrays;
    
    /**
     * Created by Administrator on 2015/9/4.
     */
    public class ReplaceBlank {
        private static int maxLength = 100;
    
        //length 为字符数组string的总容量,新增长的数组长度不能超过length
        public static void repalceBlank(String str, int trueLength, int maxLength) {
            if (str == null || maxLength <= 0) {
                return;
            }
        //如果是传统的静态数组,java中是不允许动态扩充的,如果需要扩充的话,则需要使用java自带的累积框架,如List
            char oldString[] = str.toCharArray();
            int numberBlank = 0;
            int i = 0;
            while (i < trueLength) {
                if (oldString[i] == ' ') {
                    numberBlank++;
                }
                i++;
            }
    
            int newLength = trueLength + numberBlank * 2;
            //新开辟一个数组
            char newString[] = new char[newLength];
            for (int j = 0; j < newLength; j++) {
                newString[j] = 0;
            }
            if (newLength > maxLength) {
                return;
            }
            int indexOld = trueLength - 1;
            int indexNew = newLength - 1;
            while (indexOld >= 0 && indexOld <= indexNew) {
                if (oldString[indexOld] == ' ') {
                    newString[indexNew] = '0';
                    indexNew--;
                    newString[indexNew] = '2';
                    indexNew--;
                    newString[indexNew] = '%';
                    indexNew--;
                } else {
                    newString[indexNew--] = oldString[indexOld];
                }
                indexOld--;
            }
            System.out.println(new String(newString));
        }
        public static void Test(String testName, String str) {
            if (str == null) return;
            if (testName != null) {
                System.out.println(testName + "======");
                repalceBlank(str, str.length(), maxLength);
            }
        }
    
    // 空格在句子中间
        public void Test1()
        {
            String str = "ab c";
            Test("Test1(空格在句子中间)", str);
        }
    
    // 空格在句子开头
        public void Test2()
        {
            String str = " helloworld";
            Test("Test2(空格在句子开头)", str);
        }
    
    
    // 空格在句子末尾
    
        public void Test3()
        {
            String str = "helloworld ";
            Test("Test3(空格在句子末尾)", str);
        }
    
    // 连续有两个空格
        public void Test4()
        {
            String str = "hello  world";
            Test("Test4(连续有两个空格)", str);
        }
    
    // 传入NULL
        public void Test5()
        {
            Test("Test5(传入null)", null);
        }
    
    // 传入内容为空的字符串
    
        public void Test6()
        {
            String str = "";
            Test("Test6传入内容为空的字符串", str);
        }
    
    
    //传入内容为一个空格的字符串
        public void Test7()
        {
            String str = " ";
            Test("Test7(传入内容为一个空格的字符串)", str);
        }
    
    
    // 传入的字符串没有空格
        public void Test8()
        {
            String str = "helloworld";
            Test("Test8(传入的字符串没有空格)", str);
        }
    
    
    // 传入的字符串全是空格
        public void Test9()
        {
            String str = "   ";
            Test("Test9(传入的字符串全是空格)", str);
        }
    
    
        public static void main(String[] args) {
    // TODO Auto-generated method stub
            ReplaceBlank test = new ReplaceBlank();
            test.Test1();
            test.Test2();
            test.Test3();
            test.Test4();
            test.Test5();
            test.Test6();
            test.Test7();
            test.Test8();
            test.Test9();
        }
    }

    输出结果:

    Test1(空格在句子中间)======

    ab%20c

    Test2(空格在句子开头)======

    %20helloworld

    Test3(空格在句子末尾)======

    helloworld%20

    Test4(连续有两个空格)======

    hello%20%20world

    Test6传入内容为空的字符串======

    Test7(传入内容为一个空格的字符串)======

    %20

    Test8(传入的字符串没有空格)======

    helloworld

    Test9(传入的字符串全是空格)======

    %20%20%20

  • 相关阅读:
    数组名作为左值和右值的区别
    指针与数组区别
    linux服务器开启免密登录
    mssql清空数据和添加主键约束语法
    链接服务器方式查视图导致索引失效的解决方法
    sqlserver2008r2 版本数据库迁移到2019版本导致查询效率慢的解决方法
    lnmp一键安装访问default目录可行,访问其它站点报404错误
    lPeer reports incompatible or unsupported protocol version.
    yum安装时出现:Cannot retrieve metalink for repository: epel. Please verify its path and try again
    Linux Centos7.4 下安装 LAMP环境及配置(php5.6,mysql5.7)
  • 原文地址:https://www.cnblogs.com/yangyquin/p/4908260.html
Copyright © 2020-2023  润新知