7-1 说反话-加强版

7-1 说反话-加强版

分数 12
作者 陈越
单位 浙江大学
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
感谢杭州电子科技大学李卫明老师修正数据! 感谢浙江工业大学之江学院石洗凡老师修正测试点提示。

代码长度限制
16 KB
时间限制
300 ms
内存限制
64 MB

测试点

1、sample
2、一个词,末尾有空格
3、最小词,前面有空格
4、只有空格
5、最大句子,卡strcat,前500000个字母一个单词,后面每个单词一个字母

思路(必看)

//思路变更及不断完善:
//初次思路是用int num[i][j]记住每个单词开始和结束的下标,
//其中i表示第几个单词,[i][0]表示开始,[i][1]表示结束,
//然后把每个单词赋值给char words[i][m],
//其中i表示第几个单词,m表示这个单词的内容
//最后逆序i输出结果
//初次写的代码的代码可以满足前四个测试点,但是第五个会爆掉

//想到了words不设二维数字符组,用一维的,从后往前直接用strcat连到最后输出的字符串里去,然后重新覆盖这个word就不会爆了(word的定义写在循环里),只修改了step3,step4
//但是这样会超时,所以我又改成了直接把单词赋值给final,连strcat也不用

正确代码

#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int main()
{
	 //step1:输入str,并得到长度L
	char str[510002];
	cin.getline(str, 500002);
	int L = strlen(str); //L = str的长度


	//step2:用int num[i][j]记住每个单词开始和结束的下标
	int num[200000][2];
	int judge = 0;  //judge == 0 表示上一个单词已经结束,judge == 1 时表示正在计算一个单词
	int i = 0;
	for (int k = 0; k < L; k++)
	{
		if (str[k] != ' ' && judge == 0)
		{
			num[i][0] = k;
			judge = 1;
		}
		else if (str[k] == ' ' && judge == 1)
		{
			num[i][1] = k - 1;	//空格前一个是最后一个字符
			judge = 0;
			i++;
		}
	}
	if (str[L - 1] != ' ') //最后一个单词没有空格作结尾,手动以最后一个字符做结尾
	{
		num[i][1] = L - 1;
		i++;	//自增与之前统一
	}
	i--;	//这样就保证了0-i的个数即单词数,消除了自增的影响




	//step3:把每个单词直接赋值给final
	char final[510002];
	int w = 0;
	for (int t = i; t >=0; t--)
	{
		for (int r = num[t][0]; r <= num[t][1]; r++)
		{
			final[w] = str[r];
			w++;
		}
		if (t != 0)
		{
			final[w] = ' ';
		}
		w++;
	}

	cout << final << endl;

	return 0;
}

初次尝试的代码

#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int main()
{
	//step1:输入str,并得到长度L
	char str[500002];
	cin.getline(str, 500002);
	int L = strlen(str); //L = str的长度
	

	//step2:用int num[i][j]记住每个单词开始和结束的下标
	int num[200000][2];
	int judge = 0;  //judge == 0 表示上一个单词已经结束,judge == 1 时表示正在计算一个单词
	int i = 0;
	for (int k = 0; k < L; k++)
	{
		if (str[k] != ' ' && judge == 0)
		{
			num[i][0] = k;
			judge = 1;
		}
		else if (str[k] == ' ' && judge == 1)
		{
			num[i][1] = k - 1;	//空格前一个是最后一个字符
			judge = 0;
			i++;
		}
	}
	if (str[L - 1] != ' ') //最后一个单词没有空格作结尾,手动以最后一个字符做结尾
	{
		num[i][1] = L - 1;
		i++;	//自增与之前统一
	}
	i--;	//这样就保证了0-i的个数即单词数,消除了自增的影响
		



	//step3:把每个单词赋值给char words[i][m]
	char words[100000][12];
	for (int t = 0; t <= i; t++)
	{
		int w = 0;
		for (int r = num[t][0]; r <= num[t][1]; r++)
		{
			words[t][w] = str[r];
			w++;
		}
		words[t][w] = '\0';
	}

	//step4:倒序输出words
	for (int t=i; t > 0; t--)	//i最后自增了,要从i-1开始
	{
		cout << words[t] << " ";
	}
	cout << words[0] << endl;

	return 0;
}
posted @ 2024-03-06 11:26  yesno233233  阅读(89)  评论(0)    收藏  举报