字符串单词反转

eg: input :     hello wolrd do3 do2 do1

       output:    do1 do2 do3 world hello

 

先给一个较简单的方法:

思路:1.先反转整体字符串   遍历 n/2

            2.再反转单词即可  n+m*word/2

       

void reserve_str(char * str, int pos, int len)
{
	if( !str || !len || !(len-1) )
		return;

	for(int i = 0; i < len/2; i++) {
		char temp_c = *(str+pos+i);
		*(str+pos+i) = *(str+pos+len-1-i);
		*(str+pos+len-1-i) = temp_c;
	}//for i
}
int reserve_word(char * str)
{
	if( !str ) {
		cerr << "str is null\n";
		return 0;
	}
	int len = strlen(str);
	if( len == 1 )
		return 1;

	reserve_str(str, 0, strlen(str));
	cout << str << endl;
	int p = 0;
	for(int i = 0; i <= len; i++) {
		if( *(str+i) == ' ' ) {
			reserve_str(str, p, i-p);
			//cout << str << endl;
			p = i + 1;
		} else if( *(str+i) == '\0' ) {
			reserve_str(str, p, i-p);		
		}
	}//for i

	return 1;
}


如上是一个较简单的方法。遍历的次数稍微有些多。

 

思路:反转字符串 但在反转中完成对单词的反转,这就需要两个变量来记录索引的位置。

遍历次数:n/2+wordlen/2*wordnum

int _reserve_word(char * str)
{
	if( !str )
		return 0;

	int len = strlen(str);
	int head_word_begin = 0;       //head guard index
    int head_word_end = 0;
	int tail_word_begin = len-1;   //tail guard index
	int tail_word_end = len-1;
	for(int i = 0; i <= len/2; i++) {
		if( i < len/2 ) {
			char temp_c = *(str+i);
			*(str+i) = *(str+len-1-i);
			*(str+len-1-i) = temp_c;
		}

		if( *(str+i) == ' ' ) {
			head_word_end = i;
			reserve_str(str, head_word_begin, head_word_end-head_word_begin);
			head_word_begin = head_word_end + 1;
		}

		if( *(str+len-1-i) == ' ' ) {
			tail_word_begin = len-1-i;
			reserve_str(str, tail_word_begin+1, tail_word_end-tail_word_begin);
			tail_word_end = tail_word_begin - 1;
		}
	}

	cout << str << endl;

	return 1;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值