面试题4

面试题4:替换空格     清空空格

题目:



分析

将长度为1的空格替换为长度为3的“%20”,字符差的产度变长。如果允许我们开辟一个新的数组来存放替换空格后的字符串,那么这道题目就非常简 单。设置两个指针分别指向新旧字符串首元素,遍历原字符串,如果碰到空格就在新字符串上填入“%20”,否则就复制元字符串上的内容。但是如果面试官要求 在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串,那么我们就得另想方法。

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

  1. 首先遍历原字符串,找出字符串的长度以及其中的空格数量,
  2. 根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
  3. 设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置。
  4. 如果point1指向内容不为空格,那么将内容赋值给point2指向的位置,如果point1指向为空格,那么从point2开始赋值“02%”
  5. 直到point1==point2时表明字符串中的所有空格都已经替换完毕。
分析图:剑指offer   p46

#include
#include
using namespace std;
//len为字符数组string的总容量
void replacespace(char string[],int len)
{
	if(string==NULL||len<=0)
		return;
	int blanknum=0;//空格个数
	int length=0;
	int i=0;
	while(string[i]!='\0')
	{
		++length;
		if(string[i]==' ')
			++blanknum;
		++i;
	}//字符串长度  空格个数
	int newlength=length+blanknum*2;
	if(newlength>len)
		return;
	int point1=length;
	int point2=newlength;
	while(point1>=0&&point2>point1)
	{
		if(string[point1]==' ')
		{
			string[point2--]='0';
			string[point2--]='2';
			string[point2--]='%';
		}
		else
		{
			string[point2--]=string[point1];
		}
		--point1;
	}
}
int main()
{
	char *string=new char[50];
	while(gets(string))
	{
		replacespace(string,50);
		puts(string);
	}
	system("pause");
	return 0;
}
清空空格:



分析

这道题目是需要清楚空格,那么清除空格后所得到的字符串要比原先的字符串要短,这是我们从头到尾进行清楚空格的话就不会覆盖到空格后面的字符,所以我们可以从头开始清除。

  1. 设定两个指针p1和p2初始状态都指向字符串首字符。
  2. 如果p1指向的元素不为空格,那么将p1指向的内容赋值给p2,然后p1和p2指向下一个元素;如果p1指向的内容为空格,那么p1指向下一个元素。
  3. 直到p1指向字符串末尾的'\0'时清除空格结束。

void deleteblank(char *s)
{
	char *p1=s;
	char *p2=s;
	while(*p2!='\0')
	{
		if(*p1!=' ')
			*p2++=*p1++;
		else
			*p1++;
	}
}
int main()
{
	char *s=new char[50];
	gets(s);
	deleteblank(s);
	puts(s);
	system("pause");
	return 0;
}










你可能感兴趣的:(面试题)