乾坤大挪移,空間換效率-用數組下標法在字符串str的所有ch2字符後添加一個ch3字符

在《拋磚引玉-用數組下標法在字符串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就可以完成任務。

能量守恆在這個時候也是成立的。

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