劍指offer面試題:空格替換

      題目:實現一個函數,把每個空格替換成%20,例如輸入we are happy,輸出we%20are%20happy。

      解題思路一:我相信大家和我一樣看到這道題的第一印象應該就是從頭遍歷數組,遇到空格就是將後面的字符向後移動,然後再插入字符,這樣做雖然可以解決這個問題,但是遍歷數組和向後移動字符一起進行會使時間複雜度變爲O(n^2),並且移動過的代碼會再次移動(比如happy,遇到第一個空格移動後遇到第二個空格還會移動)。這樣雖然比較容易理解,但就比較費時。這裏就不做代碼演示了,我們可以重點看看思路二。
      解題思路二:爲了使時間複雜度低可以採用從後向前遍歷數組的方式來替換空格。思想就是我們先確定替換後的字符串大小,然後從後遍歷將先將happy移動到最終的位置,然後遇到空格插入'%20',再把are移動,然後遇到空格再次插入%20。這樣就大大降低了時間複雜度,所有的字符也只移動了一次,提高了接替效率。

      具體步驟:先遍歷一次字符串,統計空格數目,然後計算出替換後字符串總長度。然後開闢新的大小的數組存放數據。定義兩個指針p1,p2(爲了實現字符的移動), 其中p1指向原字符串末尾,p2指向替換之後字符串末尾,向前移動p1,當*p1不是空格就逐個將其指向的字符複製到p2指向的空間,若遇到空格,p1向前移動1位,p2插入“%20”,相當於p2向前移動3位。

代碼如下

#include <stdio.h>
#include <stdlib.h>
void  instead(char *arr,int len)
{
	int space=0;//統計空格的數量
	int j=0;
	while (j<len)
	{
		if(arr[j]==' ')
		{
			space++;
		}
		j++;
	}
	int newlen=len+space*2;
	char *newarr=(char*)malloc(newlen*sizeof(char));//開闢新的大小的數組
	int i=0;
	while(i<len)
	{
		newarr[i]=arr[i];//將數據拷貝到新數組
		i++;
	}
	char *p1=&newarr[len-1];//指向原始字符的末尾
	char *p2=&newarr[newlen-1];//指向替換字符的末尾
	while(p1!=p2)
	{
		if(*p1!=' ')
		{
			*p2--=*p1--;//沒遇到空格就把字符放到後邊
		}
		else//遇到空格p1向前一格,p2把%20插入,相當於移動三格。
		{
			*p2--='0';
			*p2--='2';
			*p2--='%';
			p1--;
		}
	}
	for(int i=0;i<newlen;i++)//打印替換後的字符串
	{
		printf("%c",newarr[i]);
	}
	free(newarr);
}
int main()
{
    char arr[]="we are happy";
	int n=sizeof(arr)/sizeof(arr[0]);
	instead(arr,n);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章