本文主要是介绍【PTA-乙级】1009-说反话 (三种解法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言: 更新: 之前的前言是我说我写的第一种解法测试点3过不去,经过若干天后我重新看这个题。仍然觉得没问题 然后把字符数组的大小改为82就过了测试点3。 鬼知道什么情况。应该是输入的测试用例不规范吧
题目:
解法1 char型数组与string数组赋值解法:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{char arr[82] = {0};int i = 0;while ((arr[i] = getchar()) != '\n')i++;// 用来存放每一个单词string brr[40];char* p = arr;int a = 0;// 调整字符串for (int j = 0; j < 81; j++){if (arr[j] == ' ' || arr[j] == '\n')arr[j] = '\0';}// 正序存放单词while (*p != '\0'){brr[a] = p;while (*p != '\0')p++;p++;a++;}// 逆序打印单词for (int i = a - 1; i >= 0; i--){cout << brr[i];if (i == 0)break;cout << " ";}
}
注:1. 如果把这个代码整体调试一遍 会让你对字符数组,string类型对象,缓冲区等有更深的理解 (对于我来说) 建议调试一遍
2. 如果把一个字符数组里面的内容存放在一个string类型的对象中 空格不会作为终止符 只有'\0'才会终止 如下图 这也是为什么存放单词之前要对字符串调整 让每个单词成功存入string数组中
解法2 :string数组解法(最简单的解法)
#include<iostream>
using namespace std;
#include<cstring>
int main()
{//string c;//cin >> c; //输入时 空格 \n都会称为终止输入的标志//Hello' 'World' 'Here' 'I' 'Come'\n'string arr[80];int a = 0;char c;while (1){cin >> arr[a];a++;c = getchar();if (c == '\n')break;}for (int i = a - 1; i >= 0; i--){cout << arr[i];if (i == 0)break;cout << " ";}return 0;
}
注: 在输入string类型对象时 ' ' 和 ‘\n' 都会作为输入终止的标志 所以在循环输入时 完全可以放心可以把正确的单词输入进string型数组中 最后把'\n'作为循环终止的标志 退出循环即可
解法3 :char型二维数组解法
#include<iostream>
using namespace std;
#include<cstring>// 1009说反话 解法3:
int main()
{char arr[81][81];char c;int length = 0;int i = 0;//Hello ' ' World ' ' Here ' ' I ' ' Come '\n'while ((c = getchar()) != '\n'){if (c != ' '){arr[length][i] = c;i++;}else{arr[length][i] = '\0';length++;i = 0;}}arr[length][i] = '\0';for (int i = length; i >= 0; i--){cout << arr[i];if (i == 0)break;cout << " ";}return 0;
}
这个解法是 创建char型二维数组 把每个单词放置一行中 由于打印时会因'\0'终止 所以逆序打印出结果即可
总结: 如果可以把三种解法都调试一遍 会对数据的存入与读取有更深的理解;(别忘了解法1的测试点3过不去)
这篇关于【PTA-乙级】1009-说反话 (三种解法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!