剑指offer--替换空格
2017-03-21 19:33
239 查看
请实现一个函数,把字符串中的每个空格替换成%20.例如:输入"We are happy." 输出"we are%20are%20happy."。
要想实现这个函数,我们最容易想到的是,从头往前遍历,遇到空格就把空格替换换成%20,这种方法最容易想到。但他有一个缺陷,他的时间复杂度为O(n^2).每遇到空格就要把空格以后的字符往后面移,但是后面的字符也可能还有空格。这样就使有的字符多次移动,这样效率太低。
我们可以换个思路从前往后依次替换,我们能不能从后往前依次替换呢?? 答案是肯定的,当然能,而且还很好;
我们可以借助两个指针:front_ptr指向没替换前的字符串的末尾,back_ptr指向要替换后的字符串的末尾。front_ptr与back_ptr的关系为:一个空格替换成三个字符,就相当于有一个空格就多两个字符。所以back_ptr = front_ptr +空格数*(3 - 1);
如何具体实现这个函数呢?
1)首先逐步把front_ptr往前移,并且把内容复制到back_ptr指向的位置,back_ptr也向前移,直到front_ptr遇到空格。
2)遇到空格:front_ptr往前走一步,在back_ptr前插入%20;
循环1),2)直到遍历完
具体代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>
using namespace std;
//请实现一个函数,把字符串中的每个空格替换成%20.例如
//输入"We are happy." 输出"we are%20are%20happy."。
char* ReplaceBlank(char* str)
{
assert(str);
int count = 0; // 统计空格的个数
char* front_ptr = str;
while (*front_ptr != '\0')
{
if (*front_ptr == ' ')
{
++count;
}
++front_ptr;// front_ptr指向原数组的末尾->'\0'
}
//替换后数组的尾指针
char* back_ptr = front_ptr + count*(3 - 1); // 一个空格增加了两个字符
//开始进行从后往前复制
while (back_ptr > front_ptr)
{
//遇到空格替换成%20. front_ptr往前走一步,back_ptr往前走三步
if (*front_ptr == ' ')
{
*back_ptr-- = '0';
*back_ptr-- = '2';
*back_ptr-- = '%';
--front_ptr;
}
else
{
//没遇到空格,依次复制
*back_ptr-- = *front_ptr--;
}
}
return str;
}
void Test()
{
char str1[50]="We are happy.";
cout << ReplaceBlank(str1) << endl;
char str2[50] = " We are happy.";
cout << ReplaceBlank(str2) << endl;
char str3[50] = " We are happy. ";
cout << ReplaceBlank(str3) << endl;
char str4[50] = "We are happy.";
cout << ReplaceBlank(str4) << endl;
char str5[50] = " ";
cout << ReplaceBlank(str5) << endl;
char str6[50] = "Wearehappy.";
cout << ReplaceBlank(str6) << endl;
char* str7 = NULL;
cout << ReplaceBlank(str7) << endl;
}
int main()
{
Test();
system("pause");
return 0;
}
要想实现这个函数,我们最容易想到的是,从头往前遍历,遇到空格就把空格替换换成%20,这种方法最容易想到。但他有一个缺陷,他的时间复杂度为O(n^2).每遇到空格就要把空格以后的字符往后面移,但是后面的字符也可能还有空格。这样就使有的字符多次移动,这样效率太低。
我们可以换个思路从前往后依次替换,我们能不能从后往前依次替换呢?? 答案是肯定的,当然能,而且还很好;
我们可以借助两个指针:front_ptr指向没替换前的字符串的末尾,back_ptr指向要替换后的字符串的末尾。front_ptr与back_ptr的关系为:一个空格替换成三个字符,就相当于有一个空格就多两个字符。所以back_ptr = front_ptr +空格数*(3 - 1);
如何具体实现这个函数呢?
1)首先逐步把front_ptr往前移,并且把内容复制到back_ptr指向的位置,back_ptr也向前移,直到front_ptr遇到空格。
2)遇到空格:front_ptr往前走一步,在back_ptr前插入%20;
循环1),2)直到遍历完
具体代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>
using namespace std;
//请实现一个函数,把字符串中的每个空格替换成%20.例如
//输入"We are happy." 输出"we are%20are%20happy."。
char* ReplaceBlank(char* str)
{
assert(str);
int count = 0; // 统计空格的个数
char* front_ptr = str;
while (*front_ptr != '\0')
{
if (*front_ptr == ' ')
{
++count;
}
++front_ptr;// front_ptr指向原数组的末尾->'\0'
}
//替换后数组的尾指针
char* back_ptr = front_ptr + count*(3 - 1); // 一个空格增加了两个字符
//开始进行从后往前复制
while (back_ptr > front_ptr)
{
//遇到空格替换成%20. front_ptr往前走一步,back_ptr往前走三步
if (*front_ptr == ' ')
{
*back_ptr-- = '0';
*back_ptr-- = '2';
*back_ptr-- = '%';
--front_ptr;
}
else
{
//没遇到空格,依次复制
*back_ptr-- = *front_ptr--;
}
}
return str;
}
void Test()
{
char str1[50]="We are happy.";
cout << ReplaceBlank(str1) << endl;
char str2[50] = " We are happy.";
cout << ReplaceBlank(str2) << endl;
char str3[50] = " We are happy. ";
cout << ReplaceBlank(str3) << endl;
char str4[50] = "We are happy.";
cout << ReplaceBlank(str4) << endl;
char str5[50] = " ";
cout << ReplaceBlank(str5) << endl;
char str6[50] = "Wearehappy.";
cout << ReplaceBlank(str6) << endl;
char* str7 = NULL;
cout << ReplaceBlank(str7) << endl;
}
int main()
{
Test();
system("pause");
return 0;
}
相关文章推荐
- 剑指offer之java篇之空格替换(一)
- (二)剑指Offer之替换空格
- 剑指offer—替换空格
- 【剑指offer】字符串中空格的替换
- 剑指offer 替换空格
- 剑指Offer4:替换空格
- [剑指Offer]替换空格及其拓展
- 剑指offer:替换空格
- 剑指offer 算法2 替换空格(python)
- 剑指offer 面试题5: 替换空格
- 剑指offer之替换空格
- 剑指offer--面试题4:替换空格
- 剑指offer第二题替换空格 不用replace
- 剑指offer-替换空格(java语言)
- 剑指Offer面试题4(Java版),替换空格
- 剑指offer 替换空格
- 剑指Offer之 - 替换空格
- 剑指Offer之替换空格(题4)
- 剑指Offer笔记—— 二维数组中的查找 替换空格
- 剑指offer——替换空格