以单词为单位反转字符串,要求不申请任何空间

问题描述:

存在一个可读写的字符串,其中包括若干单词,单词间以空格区分,要求以单词为单位对字符串进行反转。

 

算法思想:

(1)利用异或运算可以进行不申请空间进行字符交换

(2)利用递归的思想

(3)使用strchr函数区分单词

 

解决方案:

(1)利用递归和异或运算进行字符交换,这一步将完成字符串的整体反转

// 递归进行字符交换
void recursive_swap_char(char* lhs, char* rhs)
{
	if(rhs <= lhs)
		return;

	*lhs ^= *rhs;
	*rhs ^= *lhs;
	*lhs ^= *rhs;
	
	recursive_swap_char(lhs + 1, rhs - 1);
}

 

(2)逐个对字符串内的单词进行反转,则完成以单词为单位的反转

// 递归进行单词中字符反转
void recursive_word_reverse(char* cur, char* next)
{
	// 如果是最后一个单词,按字符串进行反转
	if(next == NULL)
	{
		recursive_swap_char(cur, cur + strlen(cur) - 1);
		return;
	}

	// 当前单词内进行字符反转
	recursive_swap_char(cur, next - 1);

	// 反转下一个单词
	recursive_word_reverse(next + 1, strchr(next + 1, ' '));
}

 

完整代码:

#include <iostream>
#include <tchar.h>
using namespace std;
 
// 递归进行字符交换
void recursive_swap_char(char* lhs, char* rhs)
{
	if(rhs <= lhs)
		return;

	*lhs ^= *rhs;
	*rhs ^= *lhs;
	*lhs ^= *rhs;
	
	recursive_swap_char(lhs + 1, rhs - 1);
}

// 递归进行单词中字符反转
void recursive_word_reverse(char* cur, char* next)
{
	// 如果是最后一个单词,按字符串进行反转
	if(next == NULL)
	{
		recursive_swap_char(cur, cur + strlen(cur) - 1);
		return;
	}

	// 当前单词内进行字符反转
	recursive_swap_char(cur, next - 1);

	// 反转下一个单词
	recursive_word_reverse(next + 1, strchr(next + 1, ' '));
}

char* reverse_by_word(char* src)
{
	// 如果只有一个单词,则直接返回
	if(strchr(src, ' ') == NULL)
		return src;

	// 整体字符串反转
	recursive_swap_char(src, src + strlen(src) - 1);

	// 反转单词
	recursive_word_reverse(src, strchr(src, ' '));

	return src;
}

void print(char* src)
{
	cout << "src:    " << src << endl;
	cout << "dest:   " << reverse_by_word(src) << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char one[] = "one";
	char one_two[] = "one two";
	char one_two_three[] = "one two three";
	char one_two_three_four[] = "one two three four";
	char str_for_test[] = "There is a program for test";
	
	print(one);
	print(one_two);
	print(one_two_three);
	print(one_two_three_four);
	print(str_for_test);

	return 0;
}

运行结果:

不申请空间进行以单词为单位反转字符串的测试用例运行结果

 

附注:

(1)在网上搜到过别的同学的解法,反转字符串时采用结尾字符('/0')逐次前进的操作,即不断调用strlen,或者移位,或者加法运算,同时递归。而这里采用快速排序的思想,进行前后两个指针相互靠拢进行字符交换的递归调用,由于是在一个字符串进行操作,因而利用了指针的比较操作是有意义的。

(2)这里使用的是单词间只有一个空格,并且最后一个单词后没有空格。可能也会出现单词间有多个空格的情况,解法就需要计算空格的个数,同样可以通过strchr函数实现。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值