【剑指offer】翻转单词顺序

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27372033

题目描写叙述:
JOBDU近期来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看。但却读不懂它的意思。比如,“student. a am I”。后来才意识到。这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。

Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

输入:

每一个測试案例为一行,表示一句英文句子。

我们保证一个句子的单词数不会超过600。每一个单词的长度也不会超过30。可是须要注意的是Fish是个不拘小节的人,有时候两个单词中间可能会有非常多空格。为了方便起见,你能够觉得一行的字符总数不会超过50000个,标点符号能够和普通字母一样处理。

输出:
相应每一个測试案例。把翻转后的正确的句子单独输出一行。
例子输入:
student. a am I
I‘m a Freshman and I like JOBDU!
例子输出:
I am a student.
JOBDU! like I and Freshman a I‘m

先翻转整个字符串。再翻转每一个单词。

代码例如以下:

#include<stdio.h>

void Swap(char *a,char *b)
{
	char temp = *a;
	*a = *b;
	*b = temp;
}

/*
反转字符串
*/
void Reverse(char *str,char *begin,char *end)
{
	if(str==NULL || begin==NULL || end==NULL)
		return;

	while(begin < end)
	{
		Swap(begin,end);
		begin++;
		end--;
	}
}

/*
反转单词顺序
*/
void ReverseSentence(char *str)
{
	if(str == NULL)
		return;

	char *begin = str;
	char *end = str;
	while(*end != ‘\0‘)
		end++;
	end--;
	//反转整个字符串
	Reverse(str,begin,end);

	//反转每一个单词
	begin = str;
	while(*begin == ‘ ‘)
		begin++;
	end = begin;
	while(*begin != ‘\0‘)
	{
		while(*end!=‘ ‘ && *end!=‘\0‘)
			end++;
		end--;
		Reverse(str,begin,end);

		//跳过多个空格
		end++;
		while(*end == ‘ ‘)
			end++;
		begin = end;
	}
}

int main()
{
	char str[50000];
	while(gets(str) != NULL)
	{
		ReverseSentence(str);
		puts(str);
	}
	return 0;
}

/**************************************************************

    Problem: 1361

    User: mmc_maodun

    Language: C

    Result: Accepted

    Time:50 ms

    Memory:912 kb

****************************************************************/

对照了下剑指offer上的代码,还是有差距啊!比着书上的代码,感觉自己写的代码真是弱爆了,一点都不简洁。

姑且贴上吧,一点点进步。日后回来再做个对照!

时间: 2024-10-24 22:01:19

【剑指offer】翻转单词顺序的相关文章

剑指Offer——翻转单词顺序列

题目描述: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 分析: 同上一题的解法.剑指Offer--左旋转字符串. 代码: 1 class Solut

剑指Offer——反转单词顺序(Java)

问题描述:输入一个英文句子,反转句子中的单词的顺序,但单词内字符的顺序不变:(为简单起见,标点符号与普通字符当做一样处理) 示例       :输入:"I am a student." 输出: ".student a am I" 策略      :策略是先反转整个字符串,在根据空格划分单词,然后依次反转每个单词 代码      : public class ReverseString { /*****反转单个字符串函数****/ public char[] reve

剑指offer (42) 单词翻转

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符顺序不变 题解分析: 两次翻转: 第一次翻转整个句子 第二次解析出每个单词并将单词翻转 void reverse(char* first, char* last) { assert(first != NULL && last != NULL); while (first < last) { char temp = *first; *first = *last; *last = temp; ++first; --last; }

剑指offer---翻转单词顺序

题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? class Solution { public: void fanzhuandanci(str

剑指offer-翻转单词顺序VS左旋转字符串

题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字啊的顺序不变.为简单起见,标点符号和普通字母一样处理. 举例说明 例如输入字符串”I am a student. ”,则输出”student. a am I”. 解题思路 第一步翻转句子中所有的字符.比如翻转“I am a student. ”中所有的字符得到”.tneduts a m a I”,此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了.第二步再翻转每个单词中字符的顺序,就得到了”student. a am I”.这正

剑指offer——调整数组顺序使奇数位于偶数前面

题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 看代码: public class Solution { public static void reOrderArray(int[] arr) { int i,j,target; for (i = 1 ; i< arr.length; i++) { target = arr[i]; if (target%2!=0)

剑指Offer41 反转单词顺序,单词字符顺序不变

1 /************************************************************************* 2 > File Name: 41_ReverseWords.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月04日 星期日 16时18分34秒 6 **************************************

[剑指offer] 字符串的顺序全排列

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 结果请按字母顺序输出. 输入描述 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 输出描述 顺序输出字符串的所有排列 题目分析 这是一个字符串全排列的问题,把全部序列存在TreeSet中默认可得到字典顺序. TreeSet 基于TreeMap实现的SortedSet,可以对Set集合中的元

【Java】 剑指offer(58-1) 翻转单词顺序

  本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a student. ",则输出"student. a am I". 思路 一开始自己觉得要用split()方法,但这要开辟新的数组,占内存空间,不行. 首先实现翻转整个句子:只需要在首尾两端各放置一个