替换空格

来源:互联网 发布:端口数据采集软件 编辑:程序博客网 时间:2024/06/12 01:01

1.问题描述

请实现一个函数,把字符串中的每个空格替换成“%20”,例如输入“we are happy” ,则输出 “we%20are%20happy%20”。(来自《剑指offer》)


2.分析

我们要将字符串中的空格替换成%20,如果我们从前向后替换的话,每次替换空格后都需要将空格之后的所有字符向后移动。每次遇到空格都需要移动空格后面的字符导致时间效率低。

我们可以从后向前替换,先遍历一遍得到空格的数目,然后计算出转换后字符串的长度,设置2个指针一个指向原来字符串的末尾p1,另一个指向转换后字符串末尾p2。然后移动指针p1,逐个复制p1位置上元素到p2位置上的元素。如果遇到空格,那么将p1向前移动一格,p2向前移动3格同时插入%20。


3.代码

void ReplaceBlank(char *str,int length){    int blankOfStr     = 0;        int originalLength = 0;        if (!str || length<0)    {        return;    }        int i = 0;        while (str[i] != '\0')    {        if (str[i] == ' ')        {            blankOfStr++;        }                i++;                originalLength++;    }        int newLength = originalLength + blankOfStr*2;        if (newLength > length)    {        return;    }        while (originalLength < newLength &&           originalLength >= 0 && newLength > 0)    {        if (str[originalLength] == ' ')        {            str[newLength--] = '0';            str[newLength--] = '2';            str[newLength--] = '%';        }        else        {            str[newLength--] = str[originalLength];        }                originalLength--;    }        }

关于字符串的一些知识点 c/c++中字符串都以字符 '\0'作为结尾,为了节省内存,c/c++把常量字符串放在单独的一个内存区域。当几个指针赋值给相同的变量时,它们实际上会指向相同的内存地址,但用常量内存初始化数组时,情况却有所不同(不仅c/c++ ,java,c#也是如此)

另外在c#封装字符串的类型System.String有一个非常特殊的性质,String中的内容是不能改变的,一旦试图改变String的内容,就会产生一个新的实例,如果试图多次改变String的内容,改变之后的值只能通过返回值得到(或者把参数标记为 ref 或者 out),用String做连续多次修改,每次修改都会产生一个临时对象,这样开销太大影响效率(可以使用StringBuilder)。


遇到需要遍历数组时,注意一下从后向前遍历是否更好些。

实际应用:在网络编程中,如果url参数中含有特殊字符,如空格,‘#’等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。

转换规则:是在%后面跟上ASCII码的两位十六进制表示。


0 0