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

    一、题目描述

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

    二、解题思路

    1)简单暴力解法,我们可以很容易的想到,碰到一个空格,就加入%20,于是可以从头到尾遍历字符串,碰到空格,首先将后面的所有字符串往后移动2个字符,这样才能空出3个字符位子插入字符“%20”,对于一个长度为n的字符串,对每个空格,需要移动后面O(n)个字符,因此包含n个空格的字符串,总的时间复杂度为O(n*n)。这个代码就不写了...

    2)我们仔细的思考,难道我们真的只能0(n*n)的复杂度吗?不,我们可以更快!

    我们从后往前开始替换,首先遍历一遍字符串,统计出空格的个数,并由此能够计算出替换之后的字符串的长度。

    举个例子:

    每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。以"We are happy"为例,"We are happy"这个字符串的长度为14(包括结尾符号" "),里面有两个空格,因此替换之后字符串的长度是18。

    接着再次从后往前遍历字符串,同时设置两个指针P1和P2,P1指向原始字符串末尾,P2指向替换之后的字符串末尾。我们向前移动P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。然后把P1向前移动一格,在P2之前插入字符串“%20”,同时P2向前移动3格。重复此过程,直到所有的空格都已替换完。这样只需要扫描一遍,时间复杂度为O(n)。

    移动示意图如下:

    #include <iostream>
    #include <iterator>
    using namespace std;
    
    void replaceSpace(char* str,int length) {
    	char* ots = NULL;
    	if (str == NULL && length <= 0) {
    		return;
    	}
    	/*original_length为字符串str的实际长度*/
    	int original_length = 0;			//原始长度
    	int number_blank = 0;				//空格数
    	int i = 0;
    	while (str[i++] != '') {				//遍历字符串
    		++original_length;				//长度+1
    		if (str[i] == ' ') {
    			++number_blank;				//遇到空格+1
    		}
    	}
    	/*new_length为把空格替换成'%20'之后的长度*/
    	int new_length = original_length + 2 * number_blank;
    	ots = (char*)malloc(new_length * sizeof(char));
    	memset(ots, 0, strlen(ots));
    	if (ots == NULL) return;
    	memcpy(ots, str, strlen(str));
    
    	int index_original = original_length;	//原始字符串末尾索引值
    	int index_new = new_length;				//计算长度后的字符串末尾索引值
    
    	/*index_original指针开始向前移动,如果遇到空格,替换成'%20',否则进行复制操作*/
    	while (index_original >= 0 && index_new > index_original) {
    		if (ots[index_original] == ' ') {
    			ots[index_new--] = '0';
    			ots[index_new--] = '2';
    			ots[index_new--] = '%';
    		}
    		else {
    			ots[index_new--] = ots[index_original];
    		}
    		--index_original;
    	}
    
    	cout << ots << endl;
    };
    
    int main()
    {
    	const char* tmp = "wu han tai re li";
    	char* p = const_cast<char*>(tmp);
    	replaceSpace(p, strlen(p));
    	return 0;
    }
    

     事实上,很多网络上的代码你是绝对编译不通过的,原因很简单,str被重新计算了,然后用新的大小去索引,不崩溃才怪。

  • 相关阅读:
    SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)
    HttpWatch工具简介及使用技巧
    橙色在网页设计运用:36个启发灵感的案例
    JS Date格式化为yyyyMMdd类字符串
    60款很酷的 jQuery 幻灯片演示和下载
    浅谈SQL Server中统计对于查询的影响
    C#创建Windows Service(Windows 服务)基础教程
    使用分页方式读取超大文件的性能试验
    240多个jQuey插件
    ASP.NET性能优化之负载均衡
  • 原文地址:https://www.cnblogs.com/yiyi20120822/p/11358905.html
Copyright © 2011-2022 走看看