首页 > 其他分享 >7-1 说反话-加强版

7-1 说反话-加强版

时间:2024-03-06 11:35:35浏览次数:12  
标签:空格 加强版 int 单词 judge num str 反话

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

相关文章

  • P1429&&P7883 平面最近点对(加强版 && 加强加强版)
    这是一道非常经典的题目。首先可以想到暴力的算法,一一匹配取最小值,期望时间复杂度为$O(n^2)$,很明显过不了此题。所以我们考虑分治,我们每次将所有点按x分为两半,然后分治两半,取最小值,然后就可以获取到左右两块内部最小值,那么大范围内的最小值只有左边最小值,右边最小值或者横跨......
  • 【题解】P4722 【模板】最大流 加强版 / 预流推进
    更好阅读体验CHAPTER0废话1.常见的最大流算法可以大致分为两种:找增广路和预流推进2.从理论时间复杂度上界来看,找增广路算法的最坏时间复杂度为\(O(n^2m)\),而预流推进算法的最坏时间复杂度为\(O(n^2\sqrt{m})\),看起来预流推进要显然优于找增广路,但在实际应用(尤指OI)中,由于包......
  • P2241 统计方形(数据加强版)
    统计方形(数据加强版)题目背景1997年普及组第一题题目描述有一个\(n\timesm\)方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。输入格式一行,两个正整数\(n,m\)(\(n\leq5000,m\leq5000\))。输出格式一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正......
  • P8786 [蓝桥杯 2022 省 B] 李白打酒加强版
    原题链接题解根据样例,观察到李白总共走\(n+m\)次,每一次不是遇到酒馆就是遇到花故我们可以设\(dp[i][0/1]\)代表第\(i\)次遇到酒馆或花的方案数但是我们发现这样的状态不好转移故我们可以设\(dp[i][0/1][k]\)代表第\(i\)次遇到酒馆或花,还剩下\(k\)斗酒的方案数但......
  • PAT乙级-1009(说反话)
    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。......
  • 【题解】P5907 数列求和加强版 / P4948 数列求和
    本题解是对warzone的题解的补充。题意:求\[\sum_{i=1}^ni^ka^i\]普通版:\(k\leq2\times10^3\)。加强版:\(k\leq10^7\)。首先先考虑普通版。\[\begin{aligned}\sum_{i=1}^ni^ka^i&=\sum_{i=1}^na^i\sum_{j=0}^k{k\bracej}i^{\underline{j}}\\&=\sum_{j=0......
  • 洛谷P5907 数列求和加强版 / SPOJ MOON4
    题面描述求\[\sum_{i=1}^ni^ka^i\]对\(998244353\)取模的结果。\(O(k)\)做法为了推导方便,下令\(p=a^{-1}\)。即求\[\sum_{i=1}^n\frac{i^k}{p^i}\]我们裂项,即尝试寻找多项式\(f(x)\),使得\[\frac{x^k}{p^x}=\frac{f(x)}{p^{x-1}}-\frac{f(x+1)}{p^x}\]即\[x^k......
  • 洛谷题单指南-暴力枚举-P2241 统计方形(数据加强版)
    原题链接:https://www.luogu.com.cn/problem/P2241题意解读:要在整个n*m区域计算正方形和长方形的个数,枚举法即可。解题思路:此题枚举的对象是矩形的高i和宽j,高的范围[1,n],宽的范围[1,m],然后计算在n*m区域内有多少个i*j,i==j即属于正方形,i!=j属于长方形。那么,问题就集中在了......
  • 通达信行业板块看盘加强版指标公式源码
    创业板:=INBLOCK('创业板');中小企业:=INBLOCK('中小板');上证A股:=INBLOCK('上证A股');深证A股:=INBLOCK('深证A股');INDEH:=IF(中小企业=1,"399005$H",IF(创业板=1,"399006$H",IF(上证A股=1,"999999$H","399001$H"))),NOD......
  • P2045 方格取数加强版题解
    题目链接:P2045方格取数加强版-洛谷|计算机科学教育新生态(luogu.com.cn)题目:出一个n*n的矩阵,每一格有一个非负整数A{i,j}且A{i,j} <=10^3现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走K次,现在要......