字符扫描剑指Offer读书笔记之第二章2字符替换Strut2教程-java教程
每日一贴,今天的内容关键字为字符扫描
给定一个字符串str和一个子串SubStr,如果str面里的空间充足,写一个函数将str面里的字符ch替换成SubStr。书中只是一个特例:将格空替换成%20.
标题析分:
如果早年到后扫描str,碰到一个ch,那么ch前面的有所字符都要向后挪SubLen-1个位置。这样做的效率肯定是不高的,怎么在O(n)的时间复杂度内成完这个操纵呢。早年到后扫描不可,那就从后到前扫描。如果先预知道了有多少个字符须要替换,是否是能就先预后之替换后之str的长度,也就是最后一个字符的位置,那就从最后一个字符开始存呗。步调:
*扫描str,定确ch的个数为cnt。
*算计新str的小大,为cnt*(SubLen-1)+StrLen
*从后到前扫描,碰到ch,从后到前制复SubStr
码代如下:
//失掉指定字符的数量
int GetSpaceCount(char *str, int nLen, char ch)
{
	if(!str || nLen < 1)
		return -1;
	int cnt = 0;
	for(int i = 0; i < nLen; ++i)
	{
		if(str[i] == ch)
			++cnt;
	}
	return cnt;
}
//将指定字符换成指定字符串
void Replace(char *SrcStr, char *DesStr, char ch)
{
	if(!SrcStr || !DesStr)
		return;
	int SrcLen = strlen(SrcStr);
	int DesLen = strlen(DesStr);
	int cnt = GetSpaceCount(SrcStr, SrcLen, ch);
	int i,k;
	k = cnt * (DesLen - 1) + SrcLen;//如果有要必须要查检够不够放
	SrcStr[k]= '\0';
	for(i = SrcLen - 1; i >= 0; --i)
	{
		if(SrcStr[i] == ch)
		{
			for(int j = DesLen - 1; j >=0; --j) 
				SrcStr[--k] = DesStr[j];
		}
		else
			SrcStr[--k] = SrcStr[i];
	}
}
int main()
{
	char Str[100];
	char SubStr[10];
	char ch;
	while(gets(Str) && gets(SubStr))
	{
		scanf("%c", &ch);
		getchar();
		Replace(Str, SubStr, ch);
		puts(Str);
	}
}
关相标题链接:单词反转。考参另外一篇博客
http://blog.csdn.net/kay_zhyu/article/details/8769026
。其实有些题很简单,但是怎么样把码代写得英俊,那就须要事本了。
文章结束给大家分享下程序员的一些笑话语录: 现在社会太数字化了,所以最好是有一个集很多功能于一身的设备!
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号