美文网首页
05:替换空格

05:替换空格

作者: stoneyang94 | 来源:发表于2018-08-28 15:25 被阅读0次

题目05:替换空格

请实现一个函数,把字符串中的每个空格替换成"%20"

原因:在网络编程中,如果URL参数中含有特殊字符,如:#等,可能导致服务器端无法获得正确的参数值。
我们需要将这些特殊符号转换成服务器识别的字符。转换规则是在%后面跟上ASCII码的两位十六进制的表。比如:空格的ASCII玛是32,即十六进制的0x20,因此空格被替换成“%20”。

举例说明

例如We are happy.,则输出We%20are%20happy.

思路--时间复杂度为O(n)的解法

1. 统计空格数目

我们先遍历一次字符串,这样就能够统计出字符串中空格的综述,并可以计算出替换之后字符串的总的长度
每替换一个空格,长度增加2,因此替换以后的字符串的长度等于原来的长度加上2乘以空格的数目,我们还是以前面的字符串”We are happy"为例,“We are happy"这个字符串的长度是14,里面有两个空格,因此替换之后的字符串的长度为18

2. 尾部开始

尾部开始

我们从字符串的后面开始复制和替换。

  1. 首先准备两个指针,P1和P2. P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾。
  2. 接下来我们向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。此时字符串如(如图b)所示,灰色阴影的区域是做了字符拷贝的区域。碰到第一个空格之后,把P1向前移动一格,在P2之前插入字符串%20,由于%20的长度为3,同时也要把P2向前移动3格如图所示
    我们接着向前复制,直到碰到第二个空格(如图d) 所示。和上一次一样,我们再把P1向前移动1格,并把P2向前移动3格插入”%20“(如图e)
  3. 直到P1,P2指向同一个位置,表明所有的空格都已经替换完毕。

从上面的分析我们可以看出,所有的字符都只复制一次,因此这个算法的时间效率是O(n)

代码实现

public class _05 {
    public static void replaceAllBlank(String str) {//将空格转化为20%
        if (str == null || str.length() <= 0) {
            return;
        }
        int length = str.length();//初始长度
        int newLength = str.length() + getBlankNum(str) * 2;//最终长度
        char[] tempArray = new char[newLength];
        System.arraycopy(str.toCharArray(), 0, tempArray, 0, str.toCharArray().length);
        int indexofOriginal = length - 1;//P1
        int indexofNew = newLength - 1;//P2
        System.out.println("未替换空格时的字符串:");
        printArray(str.toCharArray());
        
        while (indexofOriginal >= 0 && indexofOriginal != indexofNew) {
            if (tempArray[indexofOriginal] == ' ') {
                tempArray[indexofNew--] = '0';
                tempArray[indexofNew--] = '2';
                tempArray[indexofNew--] = '%';
                indexofOriginal--;
            } else {
                tempArray[indexofNew--] = tempArray[indexofOriginal--];
            }
        }
        System.out.println("替换空格后的字符串:");
        printArray(tempArray);
    }

    public static int getBlankNum(String str) {//计算字符串中包含的空格个数
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            String temp = String.valueOf(str.charAt(i));
            if (temp.equals(" ")) {
                count++;
            }
        }
        return count;
    }
    
    //For test
    public static void printArray(char[] testArray) {// 打印char[] 数组
        for (char i : testArray) {
            System.out.print(i);
        }
        System.out.println();
    }
    public static void main(String[] args) {
        String str = "We are happy";
        replaceAllBlank(str);
    }
}

输出:

未替换空格时的字符串:
We are happy
替换空格后的字符串:
We%20are%20happy

相关文章

  • 05:替换空格

    题目05:替换空格 请实现一个函数,把字符串中的每个空格替换成"%20" 原因:在网络编程中,如果URL参数中含有...

  • 05替换空格

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

  • 面试题05. 替换空格

    ####### 面试题05. 替换空格 题目描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示...

  • Day12 替换空格+两个链表的第一个公共节点+第一个只出现一次

    剑指 Offer 05. 替换空格(简单)[https://leetcode-cn.com/problems/ti...

  • 面试题5

    剑指 Offer 05. 替换空格[https://leetcode-cn.com/problems/ti-hua...

  • 05. 替换空格

    链接 https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/...

  • LeetCode | 面试题05. 替换空格【剑指Offer】【

    LeetCode 面试题05. 替换空格【剑指Offer】【Easy】【Python】【字符串】 问题 力扣 请实...

  • 替换空格

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

  • 空格替换

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

  • 替换空格

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

网友评论

      本文标题:05:替换空格

      本文链接:https://www.haomeiwen.com/subject/bkrfwftx.html