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;
}
标签:空格,加强版,int,单词,judge,num,str,反话
From: https://www.cnblogs.com/yesno233233/p/18056152