剑指offer 6.3 知识迁移能力7-反转单词顺序

面试题42:反转单词顺序 VS 左旋转字符串

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。

例如输入“I am a student.”,则输出“student. a am I”。

思路:首先反转整个字符串。I am a student.”=> .tneduts a ma I”;

      然后再反转每个单词。

void reserveStr(char *begin, char *end) {
	if(begin == NULL || end == NULL) 
		return;
	while(begin < end) {
		char temp = *begin;
		*begin = *end;
		*end = temp;

		begin ++;
		end --;
	}	
}

char *reserveSentence(char *str) {
	if(str == NULL)
		return NULL;
	
	char *begin = str;
	char *end = str;
	while(*end != '\0') {
		end ++;
	}
	end --;
	// 翻转整个句子的字符串
	reserveStr(begin, end);
	// 再把每个单词翻转回来
	begin = end = str;
	while(*begin != '\0') {
		if(*begin == ' ') {
			begin ++;
			end ++;
		} else if(*end == ' ' || *end == '\0') {
			reserveStr(begin, --end);
			begin = ++end;
		} else {
			end ++;
		}
	}
	return str;
}
int main() {
//	char *str = "I AM A STUDENT."; // 程序会在*pBegin = *pEnd; 处异常,
                                   // 在这种情况下str指向的是常量字符串,
			// 编译器不允许对常量字符串修改的缘故。
//	cout << reserveSentence(str) << endl;

	char str[] = "I AM A STUDENT.";
	cout << sizeof(str) << endl;
	cout << reserveSentence(str) << endl;
	return 0;
}
代码还不够健壮,可以用strdup()

char *str = strdup("I AM A STUDENT.");


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值