題目:實現一個函數,把每個空格替換成%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);
}