在《拋磚引玉-用數組下標法在字符串str的所有ch2字符後添加一個ch3字符》(https://blog.csdn.net/weixin_43917370/article/details/106239521)中,我們留下了一個問題:
該方法涉及到數組的插入,效率較低,能否改進?
本篇我們給出一種方案。
乾坤大挪移,空間換效率。
一、題目描述
請把下面的函數補充完整:
void func(char *str, char ch2, char ch3)
{//str存儲某個字符串的首地址
//要求在str中每個ch2字符後面都添加一個ch3字符
}
二、原理介紹
1、設str串的長度爲n,申請一塊長度爲2*n+的空間str2,作爲臨時空間
2、對於str中的每個字符srt[i]進行操作,先將其放入str2對其值進行判斷,如果其是ch2,則把ch3也放入str2尾部
3、處理完畢,將編碼爲0的字符放入str2尾部
4、將str2串拷貝回str串
三、具體實現
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
void func(char *str, char ch2, char ch3)
{
int i,j,a;
//因爲會往數組中插入ch3,長度會變化
char *str2;
int n=strlen(str);
str2=(char*)malloc(2*n+1);//臨時空間
if(str2==0)
exit(-1);//異常退出程序
for(i=0,j=0;i<n;i++)
{
str2[j]=str[i];
j++;
if(str[i]==ch2)
{
str2[j]=ch3;
j++;
}
}
str2[j]=0;
strcpy(str,str2);
free(str2);
}
int main()
{
char ptr[1000] ="abababab";//定義成一個大的數組,必須有多餘空間,插入ch3
char char1='b',char2='*';
func(ptr,char1,char2);
printf("%s",ptr);
return 0;
}
分析:
本方法採用了用空間換時間的策略,一次掃描字符串str就可以完成任務。
能量守恆在這個時候也是成立的。