您的位置:首页 > Web前端

剑指Offer系列---(6)替换空格

2015-09-07 20:30 323 查看
1.题目描述:

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

2.分析:

如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,那么我们就考虑从后往前进行替换。

1)首先遍历原字符串,找出字符串的长度以及其中的空格数量;

2)根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度;

3)设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置;

4)如果point1指向的内容不为空格,那么将内容赋值给point2指向的位置,如果point1指向为空格,那么从point2开始赋值”%20”,并且第一个指针向前移动一格,第二个指针向前移动三格;

5)直到point1==point2时表明字符串中的所有空格都已经替换完毕。

3.源代码:

//  Copyright (c) 2015年 skewrain. All rights reserved.
//

#include <iostream>
#include <stdio.h>
using namespace std;
//length为字符串总容量

void ReplaceBlank(char string[],int length)
{
if (string == NULL || length <= 0) {
return;
}
//originalLength为字符串string的实际长度
int originalLength = 0;
int numberOfBlank = 0;
int i = 0;
while (string[i] != '\0') {
++ originalLength;

if (string[i] == ' ') {
++ numberOfBlank;
}
++i;
}

//newLength为把空格替换成'%20'之后的长度
int newLength = originalLength + numberOfBlank*2;
if (newLength > length) {
return;
}

int indexOfOriginal = originalLength;
int indexOfNew = newLength;
while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal) {
if (string[indexOfOriginal] == ' ') {
string[indexOfNew--] = '0';
string[indexOfNew--] = '2';
string[indexOfNew--] = '%';
}
else
{
string[indexOfNew--] = string[indexOfOriginal];
}
-- indexOfOriginal;
}
}

int main(int argc,char *argv[]){

char *string = new char[50];
while (gets(string)) {
ReplaceBlank(string, 50);
puts(string);
}

return 0;
}


拓展:清除空格

分析:

1)设定两个指针p1和p2,初始状态都指向字符串首字符;

2)如果p2指向的元素不为空格,那么将p2指向的内容赋值给p1,然后p1和p2指向下一个元素;如果p2指向的内容为空格,那么p2指向下一个元素;

3)直到p2指向字符串末尾的’\0’时清除空格结束。

源代码:

#include <iostream>
#include <stdio.h>
using namespace std;

void RemoveBlank(char *s)
{
//设置两个指针指向数组首元素
char *p1 = s;
char *p2 = s;
while ('\0'!=*p1) {
if(' '!=*p2)//如果p2指向不为空格,则将p2指向内容复制给p1指向
*p1++ = *p2++;
else//如果p2指向为空格,则p2指针向前移动一格。
p2++;
}
}

int main(int argc,char *argv[]){

char string[100] = "we are happy.";
cout<<string<<endl;
RemoveBlank(string);
cout<<string<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: