1. 程式人生 > >劍指offer(一):替換空格 字串 C語言

劍指offer(一):替換空格 字串 C語言

題目:    替換空格
請實現一個函式,將一個字串中的空格替換成“%20”。
例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。


思路1:建立兩個陣列 ,一個存放原來的,一個存放替換後的  時間複雜度過高O(n^2) ,程式碼如下:

#include<stdio.h>
#include<string.h>
#include<assert.h>
int InsteadBlank_1(char *str1,char *str2)
{
	assert(str1!=NULL);
	while(*str1)
	{
		if(*str1!=' ')
		{
			*str2= *str1;
			*str2++;
		}
		else
		{
			strcpy(str2,"%20");
			str2 = str2+3;
		}
		*str1++;
	}
	*str2 = '\0';//呼叫strcpy 手動加一個'\0'
	return 0;
}


int main()
{
	char str1[]="we are happy";
	char str2[20];
	InsteadBlank_1(str1,str2);
	printf("%s \n ",str2);
	getchar();
	return 0;

}

 

思路2

1.判斷:計算原來的count長度, 計算空格數
2.求更改之後的長度,一個空格多加兩個單位長度  ' ' ----> '%20'
3.賦值操作: 從後往前賦值。 如果遇到' ',就將%20  從後往前依次賦給相應的位置。

     具體操作如下:

1.先遍歷一次字串,這樣就可以統計出字串空格的總數,並可以由此計算出替換之後的字串的總長度。

   每替換一個空格,長度增加2,因此替換以後字串的長度等於原來的長度加上2乘以空格數目。

例如: "we are happy. "  加上空格一共有14個字元(包括'\n'),如果轉換為"we%20are%20happy",一共18個字元

2. 從字串的尾部開始複製和替換。首先準備兩個指標,P1和P2,P1指向原始字串的末尾,P2指向替換之後的字串的末尾。

    向前移動指標P1,逐個把它指向的字元複製到P2指向的位置,直到碰到第一個空格為止。

    碰到第一個空格之後,把P1向前移動1格,在P2之前插入字串"%20"。由於"%20"的長度為3,同時也要把P2向前移動3格。

如圖所示:

#include<stdio.h>
#include<string.h>
#include<assert.h>

void InsteadBlank_2(char *str,int length)
{
	assert(*str!=NULL);
	if(str==NULL || length ==0)   //判斷str是否為空,以及字串的長度
	{
		return ;
	}
	int BlankNum = 0;  //空格數
	int OldLength = 0; //原字串長度
	int i=0;
	while(str[i++]!='\0')  //遍歷字串
	{
		if(str[i] ==' ')   //當遇到空格的時候
		{
			BlankNum++;   //空格數目進行累加操作
		}
		OldLength++;  //字串長度計算
	}

	
	int NewLength_Index = OldLength +BlankNum*2;   //將空格數目-->%20  所需要的長度  設為指標p2
	int OldLength_Index = OldLength; //之前的長度  設為指標p1 

	while(OldLength_Index>=0 && OldLength_Index<NewLength_Index)
	{
		if(str[OldLength_Index] == ' ')  //從後向前遍歷,遇到空格,就將%20從後往前進行賦值操作
		{
			str[NewLength_Index--]  = '0';
			str[NewLength_Index--]  = '2';
			str[NewLength_Index--]  = '%';
		}
		else//沒有空格,直接賦值
		{
			str[NewLength_Index--]=str[OldLength_Index] ;
		}
		OldLength_Index--;
	}
}

int main()
{
	 char str3[]="we are happy.";
	 int length = strlen(str3);
	 InsteadBlank_2(str3,length);
	 printf("%s",str3);
	getchar();
	return 0;

}